java - Spring Security - 未调用自定义身份验证提供程序

标签 java spring authentication spring-security

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

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 安全角色?

最佳答案

只需删除 <custom-authentication-provider>元素。

你的 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>
...

登录.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>
...

关于java - Spring Security - 未调用自定义身份验证提供程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2031355/

相关文章:

java - 从 JScrollPane 中删除边框

java - 如何使用 Spring Security 将对象从 AJAX 传递到 Spring Controller

java - 有没有办法修剪使用 PropertyPlaceholder 读取的所有值

java - 无法安装 JDK 9 因为 "Another Java installation is in progress"

java - 我的java服务器后端代码需要部署在云中

php - 我想知道为什么我的登录在 000Webhost 上有效,但在我的系统上尝试时却不起作用

Node.js + Passport.js 无法验证不同的客户端,除非由同一应用程序提供服务

ios - 限制对 Web 服务的访问以仅允许移动客户端

java - XML 解析错误 javascript servlet

java - 启动webApp时出现 "Could not resolve placeholder KName"异常