1

Spring 3.2.2 および Majorra 2.1.25 で Spring-Security 3.1.3 を使用しています。マネージド Bean は使用しませんが、SpringBeanFacesELResolver を使用します。基本的に、私はすべてに春を使用しています。

私は以下を使用します

<http auto-config="true">
    <form-login login-page="/components/public/login.jsf" authentication-failure-handler-ref="customAuthenticationFailureHandler" />
    <intercept-url pattern="/components/admin/**" access="ROLE_ADMIN" />
    <intercept-url pattern="/components/secured/**" access="ROLE_USER,ROLE_ADMIN" />
    <intercept-url pattern="/**" />
    <session-management>
        <concurrency-control max-sessions="1" expired-url="/components/public/sessionExpired.jsf" />
    </session-management>
    <access-denied-handler ref="customAccessDeniedHandler" />
</http>

これは意図したとおりに機能します。たとえば、保護されたページにアクセスすると、ユーザーはログインに誘導され、ログイン後に要求されたページに移動します。彼が管理ページにアクセスしようとしても、ROLE_USER しか持っていない場合、customAccessDeniedHandler によってアクセス拒否ページに誘導されます。

ここまでは順調ですね。問題は次のとおりです@Secured({ "ROLE_ADMIN" })。メソッドで使用します。権限が不十分なユーザーがこのメソッドにアクセスすると、AccessDeniedException がスローされます。BUT : 私の customAccessDeniedHandler は呼び出されません! 何故ですか?

詳細情報: メソッドは AJAX 呼び出しの一部として呼び出され、ハンドラーを使用して FacesMessage をフィードバックとして設定したいと考えています。これを一元的に行うにはどうすればよいですか?これに別のメソッドをラップし、try-catch を使用して自分で AccessDeniedException をキャッチできると確信しています。しかし、セキュリティで保護する必要があるすべてのメソッドに対してこれを行うと、大量の不要な try-catch メソッドでコードが肥大化するだけです。例外を一元的に処理するにはどうすればよいですか?

4

1 に答える 1

1

私は今解決策を見つけました。私はSpring-AOPを使用し、 @Secured で注釈が付けられたすべてのメソッドにアラウンドアスペクトを「バインド」します

<!-- aspect configuration -->
<aop:config>
    <aop:aspect id="securedAspect" ref="securityFeedbackAspect">
        <aop:around pointcut="@annotation(org.springframework.security.access.annotation.Secured)" method="handleSecuredAnnotations" />
    </aop:aspect>
</aop:config>

側面はこんな感じ

@Service
public class SecurityFeedbackAspect {
    public Object handleSecuredAnnotations(final ProceedingJoinPoint pjp) throws Throwable {
        try {
            return pjp.proceed();
         } catch (AccessDeniedException e) {
            // log + set feedback for user here
         }
    }
}

これがいつか誰かに役立つことを願っています。1 つの追加情報: @Secured-check が常に最初に呼び出され、Spring-Security-Logic によって例外がスローされない場合にのみアスペクトが実行されるため、これを注釈のみの構成で動作させることができませんでした。他に方法が見つからなかったので(@Orderを使用しても)、常に最初に行くように見えるXML構成を使用することになりました

于 2013-10-24T13:11:41.280 に答える