2012-05-16 58 views
2

我有一個控制器,我想檢查一下完全認證的用戶是否與Spring Security isFullyAuthenticated()表達式提供的類似。我怎麼做?如何在控制器中以編程方式實現Spring Security SpEL isFullyAuthenticated()?

解決方案我使用基於托馬斯Nurkiewicz回答以下,只是偷實現從org.springframework.security.access.expression.SecurityExpressionRoot

public class SpringSecurityUtils { 
    private static final AuthenticationTrustResolver trustResolver = new AuthenticationTrustResolverImpl(); 

    public static boolean isFullyAuthenticated() 
    { 
     Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 
     return !trustResolver.isAnonymous(authentication) && !trustResolver.isRememberMe(authentication); 
    } 
} 

回答

2

綜觀SecurityExpressionRoot源代碼和AuthenticationTrustResolverImpl看起來像你可以使用以下條件:

public boolean isFullyAuthenticated(Authentication auth) { 
    return !(auth instanceof AnonymousAuthenticationToken || 
      auth instanceof RememberMeAuthenticationToken); 
} 

如果您獲得身份驗證,例如使用:

SecurityContextHolder.getContext().getAuthentication() 
1

你可以調用的SecurityContextHolderAwareRequestWrapperHttpServletRequestisUserInRole()方法使用字符串IS_AUTHENTICATED_FULLY

request.isUserInRole("IS_AUTHENTICATED_FULLY"); 
+0

這不是真的。 'isUserInRole()'只檢查提供的字符串與'Authentication'對象的權限列表。 'IS_AUTHENTICATED_FULLY'是'AuthenticatedVoter'消耗的一個屬性,這是一個不同的東西。 –

+1

@Luke我真的希望SpringSecurity能夠添加一些公共API來做Spring Security SPEL的壓制!我很高興向JIRA添加一個請求,如果你們還沒有一個:) – ams

相關問題