私のJEE6Webアプリケーション(主にCDI、EJB 3.1、およびJSF 2)はSpring Security 3を使用していますが、Spring依存性注入またはMVCは使用していません。ログインを処理するためにSpringAuthenticationProviderを実装しました。ログイン時に、カスタムビジネスロジックに応じてユーザーにロールを追加します。
ここで、JSR250アノテーションを使用してビジネスロジックを保護したいと思います。私のビジネスロジックは、ステートレスEJB(バージョン3.1)を使用して実装されています。
次のように、SpringのコンテキストXMLファイルをweb.xmlに含めます。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/applicationContext-security.xml
</param-value>
</context-param>
そして、XMLファイルの内容は次のとおりです。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:security="http://www.springframework.org/schema/security"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd">
<security:global-method-security jsr250-annotations="enabled"/>
<security:http auto-config="false">
<security:intercept-url pattern="/pages/**" access="ROLE_USER"/>
<security:intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
<security:form-login login-page="/login.jsf"/>
<security:anonymous/>
<security:custom-filter ref="logoutFilter" position="LOGOUT_FILTER"/>
</security:http>
<bean id="logoutFilter" class="org.springframework.security.web.authentication.logout.LogoutFilter">
<constructor-arg index="0" value="/login.jsf"/>
<constructor-arg index="1">
<list>
<bean id="customLogoutHandler" class="com.example.client.security.CustomLogoutHandler"/>
<bean id="securityContextLogoutHandler" class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler"/>
</list>
</constructor-arg>
<property name="filterProcessesUrl" value="/logout.jsf"/>
</bean>
<security:authentication-manager>
<security:authentication-provider ref="customAuthenticationProvider"/>
</security:authentication-manager>
<bean id="customAuthenticationProvider"
class="com.example.client.security.CustomAuthenticationProvider"/>
</beans>
私のクラスでは、クラスアノテーション(タイプレベル)を使用して、すべてのメソッドに特定の役割を持つユーザーのみがアクセスできるようにする必要があると述べています。
@Model
@RolesAllowed("ROLE_GROUP")
public class UserListAction {
ただし、ロールROLE_USERのみを持つユーザーも、このクラスの任意の関数にアクセスできます。次のコードを使用してデバッグしているときに、ユーザーが間違った役割を持っていないことを確認しました。
Collection<? extends GrantedAuthority> authorities = SecurityContextHolder.getContext().getAuthentication().getAuthorities();
予想どおり、権限コレクションにはROLE_GROUP権限が含まれていません。
私の注釈は完全に無視されているようですが、なぜですか?Springのpre-postアノテーションも試しましたが、効果がないようです。