Spring security2.0
From JCFWiKi
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>
