java中的接口是类吗
439
2023-03-30
详解使用Spring Security进行自动登录验证
在之前的博客使用SpringMVC创建Web工程并使用SpringSecurity进行权限控制的详细配置方法 中,我们描述了如何配置一个基于SpringMVC、SpringSecurity框架的网站系统。在这篇博客中,我们将继续描述如何使用Spring Security进行登录验证。
总结一下Spring Security的登录验证关键步骤:
1、在数据库中建好三张表,即users、authorities和persistent_logins三个。注意字段的定义,不能少,可以多,名字必须按规定来。
2、在Spring Security的配置文件中,配置好登录跳转的页面,登录处理的页面和加密情况。
3、在前台的jsp页面中,登录的字段必须和后台users表中的一致,一般都是username和password。
4、注册页面必须自己写,注册的处理也要自己写。
一、创建数据表
使用Spring Security进行登录验证,需要我们在数据库中建好相应的表,并且字段要和Spring Security内置的字段一致。主要有3张表需要建立。一是users表,包含用户名和密码以及用户状态的表;第二个是authorities表,表明该用户角色的,方便做角色控制,比如是ROLE_USER还是ROLE_ADMIN(比如admin页面可能需要用户的ROLE_ADMIN权限,而ROLE_USER权限无法登录这个管理页面);最后一个是persistent_logins表,是登录状态的记录表,主要用来提供支持“记住我”功能的。三张表的创建语句如下:
#create users table
CREATE TABLE `users` (
`username` varchar(100) NOT NULL,
`password` varchar(100) NOT NULL,
`enabled` tinyint(1) NOT NULL DEFAULT '1',
UNIQUE KEY `account` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
#create authorities table
CREATE TABLE `authorities` (
`username` varchar(50) NOT NULL,
`authority` varchar(50) DEFAULT NULL,
PRIMARY KEY (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
#create persistent_logins table
CREATE TABLE `persistent_logins` (
`username` varchar(64) NOT NULL,
`series` varchar(64) NOT NULL,
`token` varchar(64) NOT NULL,
`last_used` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`series`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
记住,这三张表字段一定要至少包含以上字段。这样Spring Security才能识别。但是,我们也可以额外添加一些字段,比如在users中添加uid等。
二、配置Spring Security的权限控制
配置Spring Security的控制信息就是配置哪些页面需要登录的用户才能访问,登录的页面是那一个,登陆成功跳转到哪里等。以如下配置为例:所有的js等在resources文件夹下的内容都不需要经过过滤器,因为这些都是静态资源。而首页(/),登录页(/signin)、注册页(/register)等不需要用户登录,但是需要经过过滤器(因为我们可能需要获取未登录用户的一些信息)。两种配置方式如下所示。最后我们使用
xmlns:xsi="http://w3.org/2001/XMLSchema-instance" xmlns:beans="http://springframework.org/schema/beans" xsi:schemaLocation="http://springframework.org/schema/beans http://springframework.org/schema/beans/spring-beans-4.0.xsd http://springframework.org/schema/security http://springframework.org/schema/security/spring-security-4.0.xsd"> class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
xmlns:xsi="http://w3.org/2001/XMLSchema-instance"
xmlns:beans="http://springframework.org/schema/beans"
xsi:schemaLocation="http://springframework.org/schema/beans
http://springframework.org/schema/beans/spring-beans-4.0.xsd
http://springframework.org/schema/security
http://springframework.org/schema/security/spring-security-4.0.xsd">
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
注意,这里定义了
三、创建登录/注册的页面
这里属于前台的范畴,如果我们要使用Spring Security自带的验证方法,需要在前台也配置一样的信息来获取验证需要的字段,如用户名和密码。所以这里也是需要注意的地方。具体的页面核心代码如下(我们的页面使用了Bootstrap的前端工具,所以要引入bootrap和jquery等外部样式和脚本语言才会正常显示,但是这些显示不会影响功能,核心的字段不变即可):
role="tab" aria-controls="home" aria-expanded="true">登录
role="tab" aria-controls="home" aria-expanded="true">登录
role="tab" aria-controls="home" aria-expanded="true">注册
role="tab" aria-controls="home" aria-expanded="true">注册
这里有两个Tab页代码,一个是登录Tab一个是注册Tab。主要是登录的Tab要和Spring Security一致,即登录的处理应当是login,即action="login",用户名的ID和name应该是username,而密码的应该是password,即提交给登录验证的两个参数应当是username和password,处理的请求页是login。
四、创建注册后台,定义登录处理
当登录注册页面做好之后,需要定义一下处理请求,即跳转的定义。然后只要写注册的后台就行了。注意一点,Spring Security的注册处理需要自己写个后台。用户提交注册后,我们需要把用户名和密码插入到数据库中,又一点注意了,由于我们之前配置了密码的加密,所以用户注册在插入数据库之前需要加密,否则后面无法验证通过。在注册用户的时候,我们需要更新users表的信息和authorities表信息,前者插入用户名和密码,并使得enabled=1(这个字段表示用户是否正常,=0的话,状态就是锁定的)。在authorities中要写入用户对应的角色(权限)。用户注册的时候密码加密的关键代码如下:
//插入users表的语句
String addUser = "insert into users(username,password) values(?,?)";
//对密码参数进行加密
String pwd = SpringSecurityUtil.encode(password);
Object[] param = {email, pwd};
//插入authorities表的语句
String addAuthority = "insert into authorities(username,authority) values(?,'ROLE_USER')";
Object[] authorityParam = {email};
int rows = 0;
try {
rows = MyQueryRunnerUtil.getQueryRunner().update(addUser, param);
rows += MyQueryRunnerUtil.getQueryRunner().update(addAuthority, authorityParam);
} catch (SQLException e) {
e.printStackTrace();
}
加密的代码如下:
/**
* BCrypt加密(适用于注册时密码加密)
*
* @param rawPassword 明文密码
* @return encoderPassword 密文密码,长度为60
*/
public static String encode(String rawPassword) {
// 调用spring security的BCrypt加密
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
String encoderPassword = encoder.encode(rawPassword);
return encoderPassword;
}
这样,用户就可以注册了。注册好了就可以使用登录功能了。
总结一下Spring Security的登录验证关键步骤:
1、在数据库中建好三张表,即users、authorities和persistent_logins三个。注意字段的定义,不能少,可以多,名字必须按规定来。
2、在Spring Security的配置文件中,配置好登录跳转的页面,登录处理的页面和加密情况。
3、在前台的jsp页面中,登录的字段必须和后台users表中的一致,一般都是username和password。
4、注册页面必须自己写,注册的处理也要自己写。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~