Spring Web Security 3.0初体験
Spring Web Security 3.0を見て、とても調和がとれています.
小さいプログラムを作って検証してください.
需要
1カスタムのuser,role,accessDecisionManager.
2 urlとroleの対応関係を設定してwebへのアクセス権限を設定することができます.
s 1は、web.xmlにspring web securityを適用するように構成されています.この構成は、spring security及びspringを適用するプロファイルの位置を指定しています.
カスタマイズされたMyUserDetails Serviceは、このクラスはUserDetails Serviceを実現し、ユーザー情報を提供するために使用されています.どこからでもユーザ名からユーザ情報を取得することができます.ここでカスタマイズしたUserDetailを返すことができます.security.xmlの中の配置は認証が必要な場合、ここからユーザ情報を得ることができると指定しています.
MyAccess DecisionManagerをカスタマイズし、Access DecisionManagerを実現しました.security.xml内の配置は、授権検査が必要な場合、MyAccess DecisionManagerが実際の検査を行うと指定しています.
decideの中には、すべての授権に関するものがあります.どうするかは私たちがどうしたいかによる.
ここではユーザーのroleが現在訪問しているurlにアクセスできるかどうかを確認します.
小さいプログラムを作って検証してください.
需要
1カスタムのuser,role,accessDecisionManager.
2 urlとroleの対応関係を設定してwebへのアクセス権限を設定することができます.
s 1は、web.xmlにspring web securityを適用するように構成されています.この構成は、spring security及びspringを適用するプロファイルの位置を指定しています.
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/security.xml</param-value>
</context-param>
<!-- listener setting-->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<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>
s 2は、security.xmlに次の断片を加え、主に二つの目的で行われる.1は自分でカスタマイズしたAccess DecisionManagerでwebへのアクセス権限を設定します.2は自分でカスタマイズしたUserDetails Serviceでユーザー情報を提供するように構成されています. <beans:bean class="allen.MyAccessDecisionManager"
id="myAccessDecisionManager">
</beans:bean>
<http auto-config="true"
access-decision-manager-ref="myAccessDecisionManager">
<anonymous enabled="false" />
<intercept-url pattern="/**" access="allen" />
</http>
<beans:bean class="allen.MyUserDetailsService"
id="myUserDetailsService">
</beans:bean>
<authentication-manager>
<authentication-provider
user-service-ref='myUserDetailsService' />
</authentication-manager>
s 3認証関連:UserDetailをカスタマイズしました. private String userName;
private String password;
private Collection<GrantedAuthority> auths;
GranntedAuthorityをカスタマイズしました.中にはstringだけがあります.カスタマイズされたMyUserDetails Serviceは、このクラスはUserDetails Serviceを実現し、ユーザー情報を提供するために使用されています.どこからでもユーザ名からユーザ情報を取得することができます.ここでカスタマイズしたUserDetailを返すことができます.security.xmlの中の配置は認証が必要な場合、ここからユーザ情報を得ることができると指定しています.
@Override
public UserDetails loadUserByUsername(String arg0)
throws UsernameNotFoundException, DataAccessException {
UserDetails details = UserCache.userCache.getUser(arg0);
return details;
}
s 4ライセンス関連:MyAccess DecisionManagerをカスタマイズし、Access DecisionManagerを実現しました.security.xml内の配置は、授権検査が必要な場合、MyAccess DecisionManagerが実際の検査を行うと指定しています.
decideの中には、すべての授権に関するものがあります.どうするかは私たちがどうしたいかによる.
ここではユーザーのroleが現在訪問しているurlにアクセスできるかどうかを確認します.
@Override
public void decide(Authentication authentication, Object securityObject,
Collection<ConfigAttribute> arg2) throws AccessDeniedException,
InsufficientAuthenticationException {
if (authentication == null || !authentication.isAuthenticated())
throw new InsufficientAuthenticationException("Not Authenticated");
Object principal = authentication.getPrincipal();
MyUserDetails myUserDetails = (MyUserDetails) principal;
Collection<GrantedAuthority> userRoles = authentication
.getAuthorities();
String url = null;
if (securityObject instanceof FilterInvocation) {
FilterInvocation filter = (FilterInvocation) securityObject;
url = filter.getRequestUrl();
}
if (!URLManager.manager.canAccessUrl(url, userRoles)) {
throw new AccessDeniedException("Role check fails.");
}
}
結び:スプリングのweb securityはとても調和がとれています.拡張は簡単です.使い心地がいいです.