보안은 어플리케이션 에서 매우 중요한 이슈이다.
Spring Security 는 어플리케이션과 결합하여 여러 수준에서 보안을 책임지는 플랫폼의 기능을 수행한다.
여기서는 Web Flow 에 적용되는 Spring Security 에 대해 알아보도록 하겠다.
Flow 실행에 보안을 적용시키고 싶다면 다음 단계에 따르자.
secured 구성요소는 접근 하기 전에 권한 확인을 적용해주며, Flow 실행 단계마다 한 번 이상은 나올 수 없다.
Flow 실행에서 세단계로 보안을 적용할 수 있다. Flow, state, transition 에 보안 적용이 가능하다.
사용되는 문법은 동일하다. secured 구성요소는 보안이 적용되야 하는 구성요소 내에 위치하면 된다.
예를 들어 view state에 보안을 적용하고자 하면,
<view-state id="secured-view"> <secured attributes="ROLE_USER" /> ... </view-state>
attributes 속성은 ','(콤마)로 구분해서 SS의 권한 속성을 리스트로 입력할 수 있다. 이 속성은 대부분 허가된 보안 롤(role)을 명시하게 된다.
스프링 시큐리티 접근 결정 매니저(access decision manager)에 의해 이 속성에 입력한 값과 사용자가 가지고 있는 값을 비교한다.
<secured attributes="ROLE_USER" />
기본적으로, 롤 기반 접근 결정 관리자를 사용하여 사용자가 접근할 수 있는지 확인한다.
만약 애플리케이션이 권한 룰을 사용하지 않는다면 이 부분을 오버라이딩할 필요가 있다.
두 가지 유형의 일치 유형 제공: any, all.
<secured attributes="ROLE_USER, ROLE_ANONYMOUS" match="any" />
이 속성은 필수가 아니다. 정의하지 않으면 기본 값은 any다.
Web Flow 설정에 추가한다.
SecurityFlowExecutionListener가 Web Flow 설정에 정의되어 있어야 플로우 실행기(executor)에 적용된다.
<webflow:flow-executor id="flowExecutor" flow-registry="flowRegistry"> <webflow:flow-execution-listeners> <webflow:listener ref="securityFlowExecutionListener" /> </webflow:flow-execution-listeners> </webflow:flow-executor> <bean id="securityFlowExecutionListener" class="org.springframework.webflow.security.SecurityFlowExecutionListener" />
보안 설정에 의해서 접근이 거절되면, AccessDeniedException 발생한다.
기본으로 롤 기반 의사결정이 이루어 지지만, 커스텀 의사결정 관리자 지정 가능하다.
<bean id="securityFlowExecutionListener" class="org.springframework.webflow.security.SecurityFlowExecutionListener"> <property name="accessDecisionManager" ref="myCustomAccessDecisionManager" /> </bean>
http와 authentication-provider로 정의하면 된다.
<security:http auto-config="true"> <security:form-login login-page="/spring/login" login-processing-url="/spring/loginProcess" default-target-url="/spring/main" authentication-failure-url="/spring/login?login_error=1" /> <security:logout logout-url="/spring/logout" logout-success-url="/spring/logout-success" /> </security:http> <security:authentication-provider> <security:password-encoder hash="md5" /> <security:user-service> <security:user name="keith" password="417c7382b16c395bc25b5da1398cf076" authorities="ROLE_USER,ROLE_SUPERVISOR" /> <security:user name="erwin" password="12430911a8af075c6f41c6976af22b09" authorities="ROLE_USER,ROLE_SUPERVISOR" /> <security:user name="jeremy" password="57c6cbff0d421449be820763f03139eb" authorities="ROLE_USER" /> <security:user name="scott" password="942f2339bf50796de535a384f0d1af3e" authorities="ROLE_USER" /> </security:user-service> </security:authentication-provider>
필터 설정.(SS 기본)
<filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>