0

私の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アノテーションも試しましたが、効果がないようです。

4

1 に答える 1

1

デフォルトでは、SpringSecurityは標準のSpringAOPを使用します。これは、Springアプリケーションコンテキストによって作成されたBeanに制限されています。ライフサイクルがSpringによって制御されていないオブジェクト(EJBなど)は影響を受けません。同様に、newまたは他のフレームワークを使用してオブジェクトインスタンスを作成する場合は、オンデマンドでオブジェクトを作成します。

メソッドセキュリティインターセプターをすべてのオブジェクトインスタンスに適用する必要がある唯一のオプションは、Aspectjを使用することです。この質問への答えは、おそらく始めるのに良い場所です。

于 2012-10-04T12:10:33.507 に答える