2013-10-07 153 views
2

對不起,我的英語。爲什麼在Spring安全中不工作的方法isAuthenticated()?我在JSF中使用:彈簧安全3 isAuthenticated()不工作

#{loginMB.authentication.authenticated} 

<sec:authorize access="hasRole('ROLE_ADMIN')"> 
    test 
</sec:authorize> 

它不工作。如果我通過驗證,所有時間都會返回true

如果呈現出角色:

#{loginMB.authentication.authorities} 

它顯示正確的,當驗證的作用是[ROLE_ADMIN],在未認證的作用是[ROLE_ANONYMOUS]

什麼時候有問題?

==== ====更新

如果LoginBean創建梅託德isAuthenticated()進行檢查AnonymousAuthenticationToken爲亞歷山大說:

public boolean isAuthenticated(){ 

    Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 
    return authentication != null && !(authentication instanceof AnonymousAuthenticationToken) && authentication.isAuthenticated(); 

} 

這是工作。謝謝Aleksandr。但授權標籤不起作用。如果我添加一個JSF頁面:

<sec:authorize access="hasRole('ROLE_ANONYMOUS')"> 
    ROLE_ANONYMOUS 
</sec:authorize> 
<sec:authorize access="hasRole('ROLE_ADMIN')"> 
    ROLE_ADMIN 
</sec:authorize> 

它打印ROLE_ANONYMOUS和ROLE_ADMIN。爲什麼?

====更新2 ====

的applicationContext-security.xml文件:

<?xml version="1.0" encoding="UTF-8"?> 
<beans:beans xmlns="http://www.springframework.org/schema/security" 
      xmlns:beans="http://www.springframework.org/schema/beans" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:context="http://www.springframework.org/schema/context" 
      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"> 

    <beans:import resource="applicationContext.xml"/> 


    <global-method-security jsr250-annotations="enabled" /> 

    <http auto-config="true" use-expressions="true"> 
     <form-login login-page="/pages/login.html" authentication-failure-url="/fail.html"/> 
     <intercept-url pattern="/**" access="permitAll" /> 

    </http> 

    <authentication-manager alias="authenticationManager"> 
     <authentication-provider user-service-ref="UserDAO"> 
      <password-encoder hash="plaintext" /> 
     </authentication-provider> 
    </authentication-manager> 

</beans:beans> 
+0

它工作正常。如果你想使用這種方法,你只需要檢查'AnonymousAuthenticationToken'。 –

+0

我在LoginBean中創建了metod isAuthenticated()來檢查AnonymousAuthenticationToken,它是可行的。但春季安全授權標籤不起作用。 – z3r9

+0

你是什麼意思? –

回答

3

問題解決了。

  1. 如果創建梅託德isAuthenticated()在LoginBean進行檢查AnonymousAuthenticationToken爲亞歷山大說:

    public boolean isAuthenticated(){ 
    
         Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 
         return authentication != null && !(authentication instanceof AnonymousAuthenticationToken) && authentication.isAuthenticated(); 
    
        } 
    

    這是工作。謝謝Aleksandr。

  2. 對於將工作授權標籤在JSF頁面閱讀here。我有it問題。