【问题标题】:Spring Security - Custom authentication provider not calledSpring Security - 未调用自定义身份验证提供程序
【发布时间】:2011-01-03 03:11:58
【问题描述】:

我有一个带有以下设置的 Spring 应用程序(Spring 版本 2.5.6.SEC01,Spring Security 版本 2.0.5)(这是基于 @987654321 @):

security-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 以便设置安全角色?我什至不需要自定义服务,但在 security-config.xml 中有这个

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

即使我有用户和权限表,也没有设置角色。如何设置 Spring 安全角色?

【问题讨论】:

  • 注意: &lt;custom-authentication-provider&gt;deprecated

标签: java spring authentication spring-security


【解决方案1】:

我认为 authentication-provide 标签应该带有 authentication-manager 标签。

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

希望这行得通!

【讨论】:

    【解决方案2】:

    只需删除 &lt;custom-authentication-provider&gt; 元素。

    您的MyUserDetailsService 不是自定义AuthenticationProvider。实际上,您正在尝试为默认 DaoAuthenticationProvider 提供自定义 UserDetailsService。 这是该场景的工作配置示例(我再次建议您使用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>
    ...
    

    login.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>
    ...
    

    【讨论】:

    • 这具有相同的结果 - 我在 MyUserService 中看不到任何内容,无论自动配置是否为真或者 是否存在。跨度>
    • 我发布的示例对我来说效果很好。当用户点击登录表单中的提交按钮时调用 loadUserByUsername()。
    • 你的配置或java类中还有什么不同的吗?我的安全 xml 与您在上面的完全一样,并且没有调用 MyUserService。
    • 查看forum.springsource.org/showthread.php?t=65079(帖子6),它提到如果客户提供商处理身份验证,则不会查询其他人。我没有自定义身份验证提供程序(因为我删除了该标签,但它没有影响我的服务。您的登录表单是如何在 servlet xml 和 jsp 中配置的?如果我的 UserDetailsS​​ervice 被调用是否会影响?
    • 你检查过你的日志吗?在 UserService 上指定 时,日志中会出现异常。如果你错过了,你可能会错过一些其他的配置问题。
    猜你喜欢
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 2016-07-19
    • 2021-12-25
    • 2016-09-24
    • 2018-09-14
    • 2016-01-06
    • 2015-08-16
    相关资源
    最近更新 更多