在Spring安全中使用mysql数据库进行用户认证?

6

我想在我的Web应用程序中使用Spring安全来验证用户身份。 由于我不是Spring框架的成熟用户,我无法清楚地了解如何进行配置以使用jdbc-user-service。 我已经进行了以下配置,但它不起作用。

<authentication-manager>
    <authentication-provider>
         <jdbc-user-service data-source-ref="myDataSource"/>
    </authentication-provider>        
</authentication-manager>
<beans:bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <beans:property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <beans:property name="url" value="jdbc:mysql://localhost:3306/testDB"/>
    <beans:property name="username" value="admin"/>
    <beans:property name="password" value="admin"/>
</beans:bean>

请问有人能够帮我解决一个样例配置文件的问题吗? 提前感谢。


你有什么问题吗?你能发布堆栈跟踪或更清晰地描述你面临的任何问题吗? - beny23
3个回答

6
您通常可以使用自定义的UserDetailsService来实现。 UserDetailsService是用于在用户尝试登录时加载关于该用户的数据的DAO。请查看Spring中的loadUserByUsername(String username)方法和UserDetails类。
您需要在上下文中定义它:
<bean id="myDetailsService"
    class="com.company.service.impl.MyDetailsService" />

为了使用它,您可以将以下内容添加到安全配置中:

<authentication-manager>
    <authentication-provider user-service-ref="myDetailsService" />
</authentication-manager>

并且所有的安全过滤器将会使用它。

如果你需要帮助实现它,可以提出更具体的问题,但我认为你不会遇到麻烦。


你能否简要介绍一下它的实现方法?我已经尝试过了,但是没有成功。 - TKV
您可以在答案中提供的链接中查看有关实现的详细信息。http://www.codercorp.com/blog/spring/security-spring/writing-custom-userdetailsservice-for-spring-security.html - Simeon
1
链接已经失效,请参考此链接:https://dev59.com/7VrUa4cB1Zd3GeqPlJJz。 - Vish

6
另一种方法是使用标准的Spring Security数据库架构创建表格(http://static.springsource.org/spring-security/site/docs/3.0.x/reference/appendix-schema.html)。然后您可以简单地使用Spring的JDBC用户服务:
<security:authentication-provider >
    <security:jdbc-user-service data-source-ref="dataSource" /> 
    <security:password-encoder hash="sha" />
</security:authentication-provider>

或者,如果您想使用自己的模式,可以像这样覆盖查询:
<security:authentication-provider>
    <securiy:jdbc-user-service 
      data-source-ref="dataSource"
      users-by-username-query="select username, password from users where username=?"
      authorities-by-username-query="select username, roleName from role..."
      role-prefix="ROLE_"
    />
 </security:authentication-provider>

这个查询固定了吗?因为当我根据我的表更改查询时,它不起作用,只有当我按照这个查询设计时才能工作。 - RishiPandey

0
将以下代码添加到您的<authentication-provider>标签中:
<authentication-provider>
    <password-encoder hash="sha-256" />
    <jdbc-user-service data-source-ref="dataSource"
            users-by-username-query="
                SELECT username, password, enabled
                FROM user WHERE username = ?"

            authorities-by-username-query="
                SELECT u.username, r.role_name
                FROM user u, user_role r, assigned_role a
                WHERE u.id = a.username
                AND r.id = a.role_id
                AND u.username = ?"
        />
</authentication-provider>

当然,您需要调整查询以匹配您的表名。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接