Spring security2.0

From JCFWiKi

Jump to: navigation, search

그림:check.gif

  • 산출물 :Spring security 2.0 가이드
  • 작성자: 고경철
  • 작성일 : 2008/06/09
  • 버전 :3.0
  • 개정이력 :

Copyright © 2008 Daewoo Information Systems Co., Ltd.

목차

[편집] Part1: Spring security 소개

[편집] Preview: Authentication & Authorization

인증과 권한 절차
인증과 권한 절차

[편집] Authentication(인증)

  • 자원에 대한 접근을 승인하거나 제한하기로 결정하기 전에, 사용자는 적절한 보안 확인을 해야 함.
  • 로그인 페이지

[편집] Authorization(권한)

  • 자원 별 접근 권한을 제한 하여야 함.
  • 유저 등급별 다른 서비스 제공

[편집] spring security의 필요성

  • 자바 플렛폼에서 스프링 프레임워크를 기반으로 개발된 보안 프레임워크의 필요성
  • 이식성과 확장성이 우수한 보안프레임워크 필요성

[편집] Spring Security의 개요

[편집] acegi란?

  • Ben Alex
  • 알파벳 홀수 1, 3, 5, 7, 9를 따서 만든 이름
  • Acegi는 스프링 프레임워크의 공인 서브 프로젝트이며 http://acegisecurity.org 에서 운영되고 있는 오픈소스 프로젝트

[편집] Spring Security(acegi)의 기능

  • 로그인 기능 제공
  • password를 통한 user 인증
  • 각 개인이 허락된 리소스에 대한 check과 리소스 redirect
  • 로그인 실패 시 Denied page 보여줌
  • 인증 성공한 유저에 대해 유저 클라이언트에 보한 쿠키를 세팅해줌으로서 다음 인증 때 로그인 없이 열람가능
  • 로그아웃 시 유저 클라이언트의 보안세션을 삭제
  • 유저들의 security 등급 및 정책을 DB에서 관리할 수 있음.

[편집] Part2: spring security 2.0

[편집] spring security 2.0 소개

  • spring security 2.0에는 다음 기능이 추가되었다.
2.0에 추가된 기능들 요약
- OpenID 지원
- NTLM
- JSR 250 애노테이션
- AspectJ 포인트컷 표현식
- 도메인 ACL 기능강화
- RESTful URI 권한
- 그룹
- 계층적인 권한
- user 관리 API
- 데이터베이스 기반 "remember me"
- portlet 인증(로그인)
- 언어 추가
- Web Flow 2.0 지원
- Spring IDE 시각화와 자동완성
- 스프링 웹 서비스 1.5를 사용하여 WSS 기능 지원

[편집] (2.0 버전 추가사항)namespace Configuration

가장 흔하게 사용되는 형태를 잡아서 네임스페이스를 설계했다. 다음과 같이 나눠져 있다.

  • Web/Http Security - 인증, URL 보안, 로그인 페이지 보여주기, 에러 페이지 보여주기 등...
    • Business Object (Method) Security - 서비스 계층
    • AuthenticationManager - 프레임워크 내 다른 부분들에서 필요한 인증 요청을 다룬다.
    • AccessDecisionManager - 해당 리소스에 접근 권한이 있는지 결정하는 곳.
    • AuthenticationProviders - 인증 담당자가 사용할 인증 방법들. remeberme, OpenID, 로그인 페이지 등...
    • UserDetailService - 인증 담당자가 사용자 정보를 가져올 때 사용하는 빈.

[편집] DelegatingFilterProxy로 web.xml 설정하기

  • spring security 2.0의 namespace configuration을 적용하기 위해서는 모든 필터들을 위임하는 DelegatingFilterProxy를 선언해주어야 한다.
<filter>
		<filter-name>springSecurityFilterChain</filter-name>
		<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
	</filter>
 
 
	<filter>
		<filter-name>struts-cleanup</filter-name>
		<filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
	</filter>
	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
	</filter>
 
	<filter-mapping>
		<filter-name>springSecurityFilterChain</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
 
 
 
	<filter-mapping>
		<filter-name>struts-cleanup</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

[편집] <http> 설정

  • <http>설정을 사용하면 xml을 최소화로 줄일 수 있다. 또한 기본 설정 지원이 가능하여 아래와 같이 설정해주어도 사용할 수 있다.
<sec:http auto-config="true">
      <sec:form-login />
      <sec:anonymous />
      <sec:http-basic />
      <sec:logout />
      <sec:remember-me /> 
</sec:http>
  • 사용자가 직접 이동 페이지나 옵션을 지정할 수 도 있다.
<sec:http auto-config="true" access-denied-page="/403.jsp">  
    <sec:concurrent-session-control max-sessions="1" exception-if-maximum-exceeded="true" />  
    <sec:form-login login-page="/login.jsp" authentication-failure-url="/login.jsp" default-target-url="/index.jsp" />  
    <sec:logout logout-success-url="/login.jsp"/>  
</sec:http>
  • intercept-url을 통해 웹 주소 url에 권한을 걸 수 있다.
<sec:http auto-config="true" access-denied-page="/403.jsp">  
    <sec:intercept-url pattern="/index.jsp" access="ROLE_ADMINISTRATOR,ROLE_USER"/>  
    <sec:intercept-url pattern="/securePage.jsp" access="ROLE_ADMINISTRATOR"/>  
    <sec:intercept-url pattern="/**" access="ROLE_ANONYMOUS" />  
</sec:http>
  • DB로 유저 이름, 권한 조회해오기
	<sec:authentication-provider>
		<sec:jdbc-user-service data-source-ref="dataSource"
			users-by-username-query="SELECT username,  password,  enabled   FROM USERS where username = ?"
			authorities-by-username-query="SELECT username, authority from authorities where username = ?"
			 />
	</sec:authentication-provider>

[편집] annotation을 이용한 method 권한

  • 아래 엘리먼트를 등록해서 애노테이션 기반 보안이 가능하도록 설정한다.
<global-method-security secured-annotations="enabled">
	<!-- AspectJ pointcut expression that locates our "post" method and applies security that way-->
	<!-- 
	<protect-pointcut expression="execution(sample.user.action.UserAction*(..))" access="ROLE_SUPERVISOR"/>
        -->
</global-method-security>
  • 혹은 다음과 같은 방법으로 bean으로 설정한다.
<bean id="securedObject" class="com.habuma.expectations.springsecurity.intercept.SecuredObject">
	<sec:intercept-methods>
              <sec:protect access="ROLE_SECRET_AGENT" method="getSecuredData"/>
	</sec:intercept-methods>
</bean>
  • 권한을 설정할 메소드에는 다음과 같이 annotation을 등록한다.
@Secured( {"ROLE_SUPERVISOR"})
public void createUser(User user) {
userDao.createUser(user);
//jdbcUserDetailsManager.createUser(user);
}

[편집] 그룹

<sec:authentication-provider>
		<sec:jdbc-user-service data-source-ref="dataSource"
			users-by-username-query="SELECT username,  password,  enabled   FROM USERS where username = ?"
			authorities-by-username-query="SELECT username, authority from authorities where username = ?"
			group-authorities-by-username-query="SELECT g.id, g.group_name,	ga.authority
FROM groups g, group_members gm, group_authorities ga
WHERE gm.username = ? AND g.id = ga.group_id AND g.id = gm.group_id" />
 
	</sec:authentication-provider>