2

Spring Security 3.1.2 でいくつかのカスタム例外処理を構成しようとしています。ここここで見つけた例に従ってみましたが、どちらも機能しません。私は Spring Security を初めて使用します。これは、事前認証フィルターを使用しているという事実と関係があるのではないかと考えています。AuthenticationUserDetailsS​​ervice 実装の loadUserDetails() メソッド内からカスタム例外をスローしています。

public class AuthServiceImpl implements AuthenticationUserDetailsService<Authentication> {
  @Autowired
  private AuthDao authDao;

  @Override
  public UserDetails loadUserDetails(Authentication auth) throws UsernameNotFoundException {
    Request req = (Request) auth.getPrincipal();

    //get user details
    User u = authDao.loadUser(req.getSessionId());

    //check user rights for requested action
    if(!u.getRights().contains(req.getAction()){
      throw new CustomAuthException("User does not have permission to perform this action");
    }

    return u;
  }
}

例外がスローされると、例外の詳細を含む通常の Tomcat 500 ページが表示されます。なんらかの理由で、カスタム例外がまったく処理されません。カスタム ハンドラにいくつかの println() を追加しましたが、呼び出されていません。

このメソッドが何らかの形で Spring の例外処理から除外されているのではないかと考え始めています。必要に応じてさらに多くのコード例を提供できますが、現時点では、共有に関連するものは何かわかりません。

4

1 に答える 1

2

SimpleMappingExceptionResolverを使用します。Spring MVC コンポーネントです。そのため、コントローラーの実行中に例外が発生した場合、DispatcherServlet は SimpleMappingExceptionResolver を呼び出します。問題は、 AuthenticationUserDetailsS​​ervice 実装がログイン アクション中にのみ使用されることです。そして、このアクションはSpring Security フィルターによって直接処理されます (Spring MVC は使用されません)。この場合、リクエストは DispatcherServlet に到達せず、SimpleMappingExceptionResolver は呼び出されません。

于 2013-02-04T10:10:16.643 に答える