4

セキュリティ認証プロセスで認証オブジェクトにカスタム データを追加したい:

public class MyAuthFilter extends AbstractAuthenticationProcessingFilter {

    MyUserDetailService userDetailService;  // <==== How to wire??

    @Override
    public Authentication attemptAuthentication(
            HttpServletRequest request,
            HttpServletResponse response)
            throws AuthenticationException, IOException, ServletException {
        ...
        Authentication auth = new UsernamePasswordAuthenticationToken(
               username,
               r.sessionId,
               Arrays.asList(new GrantedAuthority[]{new SimpleGrantedAuthority(grantedUserRole)}));
        auth.setDetails(userDetailService.getDetail()); // <== Save detail to auth.
        return auth;
    }
}

MyUserDetailService サービスを接続するにはどうすればよいですか?

MyUserDetailService をプリンシパル マッピングにキャッシュするにはどうすればよいですか (不要な呼び出しを回避userDetailService.getDetail()し、メモリ不足にならないようにするため)。

PS spring-security.xml :

<http use-expressions="true" auto-config="false" entry-point-ref="oauthEntryPoint" authentication-manager-ref="oauthAuthenticationManager">
    <custom-filter position="FORM_LOGIN_FILTER" ref="myFilter" />
    <intercept-url pattern="/login.htm" access="permitAll" />
    <intercept-url pattern="/**" access="isAuthenticated()" />
    <anonymous username="anonymous" enabled="true" granted-authority="AN" key="anonymous-security" />
    <logout invalidate-session="true" logout-url="/logout" success-handler-ref="logoutHandler"/>
</http>

<beans:bean id="myFilter" class="com.web.filter.MyAuthFilter"> ...</beans:bean>
4

1 に答える 1

3

Spring Security は通常の Spring アーキテクチャに従っているため、私のカスタムAbstractAuthenticationProcessingFilterは単純な豆です。

@Componentで宣言されているようにクラスをマークする必要はありませんspring-security.xml。そして、私は使用するかもしれません:

 @Autowired
 private UserService userService;

また:

public class MyAuthFilter
extends AbstractAuthenticationProcessingFilter
implements ApplicationContextAware {
    private UserService userService;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext)
            throws BeansException {
        userService = applicationContext.getBean(UserService.class);
    }
...
}

userDetailService.getDetail() の値を認証に配置した後:

UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(
    userName, sessionId,
    AuthorityUtils.createAuthorityList(grantedUserRole));     
auth.setDetails(userService.get(userName));

認証オブジェクトへのセッション保持アソシエーションとして自動的にキャッシュされ、セッションの無効化後にこのアソシエーションが GC に渡されます。

于 2013-12-04T09:50:28.793 に答える