2010-01-08 88 views
2

我有一個Spring應用程序(Spring版本2.5.6.SEC01,Spring Security的版本2.0.5)與以下設置(這是基於關閉的this question):春季安全 - 自定義身份驗證提供不叫

安全-config.xml中文件,我有以下配置:

<http> 
    <!-- Restrict URLs based on role --> 
    <intercept-url pattern="/WEB-INF/jsp/login.jsp*" access="ROLE_ANONYMOUS" /> 
    <intercept-url pattern="/WEB-INF/jsp/header.jsp*" access="ROLE_ANONYMOUS" /> 
    <intercept-url pattern="/WEB-INF/jsp/footer.jsp*" access="ROLE_ANONYMOUS" /> 
    <intercept-url pattern="/login*" access="ROLE_ANONYMOUS" /> 
    <intercept-url pattern="/index.jsp" access="ROLE_ANONYMOUS" /> 
    <intercept-url pattern="/logoutSuccess*" access="ROLE_ANONYMOUS" /> 

    <intercept-url pattern="/css/**" filters="none" /> 
    <intercept-url pattern="/images/**" filters="none" /> 
    <intercept-url pattern="/**" access="ROLE_ANONYMOUS" /> 
    <anonymous /> 
    <form-login login-page="/login.jsp"/> 
</http> 

<beans:bean id="myUserDetailsService" class="com.example.login.MyUserDetailsService"> 
    <beans:property name="dataSource" ref="dataSource" /> 
    <custom-authentication-provider /> 
</beans:bean> 

<authentication-provider user-service-ref="myUserDetailsService" /> 

com.example.login.MyUserDetailsS​​ervice類定義爲:

public class MyUserDetailsService extends SimpleJdbcDaoSupport implements UserDetailsService { 
    @Override 
    public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException, 
      DataAccessException { 
    logger.info("MyUserDetailsService.loadUserByUsername: Entered method. Username [" + userName + "]"); 
    ... 
    } 
} 

但我沒有看到這條日誌行。我如何定義一個自定義的UserDetailsS​​ervice,以便設置安全角色?我甚至都不需要自定義的服務,但在安全-config.xml中有這個

<authentication-provider> <jdbc-user-service data-source-ref="dataSource" /> 
</authentication-provider> 

不設置,即使我有用戶和權限表的作用。我如何設置Spring Security角色?

+0

**注意:**''是[棄用](http://forum.springsource.org/showthread.php?76596-Spring-Security-3.0.0.M2-Released )。 – 2011-08-15 13:17:37

回答

2

只刪除<custom-authentication-provider>元素。

您的MyUserDetailsService不是一個自定義AuthenticationProvider。其實你試圖提供一個自定義UserDetailsService默認DaoAuthenticationProvider。 下面是針對該方案的工作配置的例子(我再次建議你使用auto-config):

<http auto-config = "true"> 
    <intercept-url pattern="/login.jsp" access="ROLE_ANONYMOUS" /> 
    ... 
    <intercept-url pattern="/**" access="ROLE_USER" /> 

    <form-login login-page="/login.jsp" default-target-url="/XXX.html" /> 
</http> 

<authentication-provider user-service-ref = "userDetailsService" /> 

<beans:bean id = "userDetailsService" class = "com.example.MyUserService" /> 

編輯:

的web.xml:

... 
<filter> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
... 

登錄.jsp:

... 
<form method = "POST" action = "<c:url value = "/j_spring_security_check" />"> 
    <table> 
     <tr> 
      <td class = "label">Login:</td> 
      <td><input type = "text" name = "j_username" /></td> 
     </tr> 
     <tr> 
      <td class = "label">Password:</td> 
      <td><input type = "password" name = "j_password" /></td> 
     </tr> 

     <tr> 
      <td colspan = "2"><input type = "submit" value = "Log in" /></td> 
     </tr> 
    </table> 
</form> 
... 
+0

這有同樣的結果 - 我沒有看到MyUserService中的任何內容,auto-config是否爲true或者是否存在。 – 2010-01-08 23:43:03

+0

我發佈的示例適合我。當用戶單擊登錄表單中的提交按鈕時,會調用loadUserByUsername()。 – axtavt 2010-01-09 00:41:31

+0

你的配置或java類中有不同的東西嗎?我有我的安全xml完全按照你的要求,MyUserService沒有被調用。 – 2010-01-09 04:40:39

0

我認爲身份驗證提供標記應該帶有身份驗證管理器標記。

<authentication-manager alias="authenticationManager"> 
    <authentication-provider user-service-ref="myUserService" /> 
</authentication-manager> 

希望這個作品!

相關問題