在之前的博客使用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)等不需要用户登录,但是需要经过过滤器(因为我们可能需要获取未登录用户的一些信息)。两种配置方式如下所示。最后我们使用这个配置来说明登录页面是”/signin”,即所有需要用户登录的页面,在用户未登录情况下需要跳转到这个页面,让用户登录。authentication-failure-url配置的是用户登录失败的页面,而default-target-url是配置用户登录成功后跳转的页面。

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:beans="http://www.springframework.org/schema/beans"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-4.0.xsd

http://www.springframework.org/schema/security

http://www.springframework.org/schema/security/spring-security-4.0.xsd">

class="org.springframework.context.support.ReloadableResourceBundleMessageSource">

classpath:myMessages

注意,这里定义了,表明登录的时候会对密码进行加密,那么后面我们写注册页面的时候必须要对密码加密之后才能存入数据库。

三、创建登录/注册的页面

这里属于前台的范畴,如果我们要使用Spring Security自带的验证方法,需要在前台也配置一样的信息来获取验证需要的字段,如用户名和密码。所以这里也是需要注意的地方。具体的页面核心代码如下(我们的页面使用了Bootstrap的前端工具,所以要引入bootrap和jquery等外部样式和脚本语言才会正常显示,但是这些显示不会影响功能,核心的字段不变即可):

  • role="tab" aria-controls="home" aria-expanded="true">登录

  • role="tab" aria-controls="home" aria-expanded="true">注册

Email address

Password

点击登录

Email address

Password

Password

点击注册

这里有两个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、注册页面必须自己写,注册的处理也要自己写。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

java spring登录验证_详解使用Spring Security进行自动登录验证相关推荐

  1. java 配置文件的路径_详解java配置文件的路径问题

    详解java配置文件的路径问题 详解java配置文件的路径问题 各种语言都有自己所支持的配置文件,配置文件中有很多变量是经常改变的.不将程序中的各种变量写死,这样能更方便地脱离程序本身去修改相关变量设 ...

  2. java新建一个女朋友_详解java创建一个女朋友类(对象啥的new一个就是)==建造者模式,一键重写...

    创建一个女朋友,她有很多的属性,比如:性别,年龄,身高,体重,类型等等,虽然每个女朋友都有这些属性,但是每个人找女朋友的要求都是不一样的,有的人喜欢男的,有的人喜欢女的,有的喜欢胖的,不同的人可以根据 ...

  3. java springmvc权限校验_详解Spring MVC使用Filter实现登录及权限验证判断

    登录和权限验证判断在后台管理系统中是最常用的功能,这部分代码是比较固定和独立的,为了减少对业务代码入侵性,一般我会考虑使用Filter来实现,下面我就来详细说一下我的实现思路和代码: 前台页面: St ...

  4. java spring 登录验证_详解使用Spring3 实现用户登录以及权限认证

    使用Spring3 实现用户登录以及权限认证 这里我就简单介绍一下,我在实现的时候处理的一些主要的实现. 1.用户登录 用户名 密 码 © 2013 - 2014 | 以上是前台页面,后台的就是一个简 ...

  5. java中batch基础_详解Spring batch 入门学习教程(附源码)

    详解Spring batch 入门学习教程(附源码) 发布时间:2020-09-08 00:28:40 来源:脚本之家 阅读:99 作者:achuo Spring batch 是一个开源的批处理框架. ...

  6. java按钮权限控制_详解Spring Security 中的四种权限控制方式

    Spring Security 中对于权限控制默认已经提供了很多了,但是,一个优秀的框架必须具备良好的扩展性,恰好,Spring Security 的扩展性就非常棒,我们既可以使用 Spring Se ...

  7. java spring框架 注解_详解Java的Spring框架中的注解的用法

    1. 使用Spring注解来注入属性 1.1. 使用注解以前我们是怎样注入属性的类的实现: class UserManagerImpl implements UserManager { private ...

  8. java事务是基于数据库的么_详解在Spring Boot中使用数据库事务

    我们在前面已经分别介绍了如何在spring Boot中使用JPA以及如何在Spring Boot中输出REST资源.那么关于数据库访问还有一个核心操作那就是事务的处理了,前面两篇博客小伙伴们已经见识到 ...

  9. java 线程一直运行状态_详解JAVA 线程-线程的状态有哪些?它是如何工作的?

    线程(Thread)是并发编程的基础,也是程序执行的最小单元,它依托进程而存在. 一个进程中可以包含多个线程,多线程可以共享一块内存空间和一组系统资源,因此线程之间的切换更加节省资源.更加轻量化,也因 ...

  10. java注解 源码_详解Java注解教程及自定义注解

    详解Java注解教程及自定义注解 更新时间:2016-02-26 11:47:06   作者:佚名   我要评论(0) Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个 ...

最新文章

  1. Android : 反射机制获取或设置系统属性(SystemProperties)
  2. 关于VC的dialog框PreTranslateMessage不响应现象及解决办法
  3. uva 725 Division(暴力模拟)
  4. 感谢大家对我微软TECHED2013课程的支持
  5. Springboot利用poi导出excel下载
  6. PyQt5, PushButton
  7. (54)FPGA基础编码D触发器(三)
  8. Linux学习总结(64)——DBA常用的Linux命令汇总
  9. Ubuntu 18.04 安装 Moodle
  10. lottie动画效果使用简例
  11. Tableau怎么制作专业图表
  12. 牧牛区块链,区块链经济学应该关注的问题
  13. 对于iPhone描述文件的签名认证
  14. 如何实现跳转至QQ 或者QQ的加好友页面。
  15. 实现图片中文的识别和获取图片上文字的坐标(java实现)
  16. 巧用Netstat排除网络故障
  17. alpine linux apk删除,把玩Alpine linux(二):APK包管理器
  18. linux命令--mkdir 与文件权限
  19. 使用Hyper-V的虚拟机搭建集群
  20. 【Java】Ceph对Swift的支持及Java…

热门文章

  1. SLAM--LSD_SLAM在高版本系统中运行(ubuntu20.04 ROS-noetic)
  2. exchange rate维护
  3. 一台计算机多个屏幕,一台电脑两个显示器怎么设置
  4. 计算机应用基础——计算机硬件(一)
  5. [NIPS 2018] Delta Encoder: An Effective Sample Synthesis Method for Few Shot Object Recognition
  6. 2021国赛新大陆物联网Ubuntu系统维护(中职)
  7. 负折射率波导matlab,介质波导的数值模拟
  8. 可以自己diy壁纸的app_有什么APP可以做壁纸?
  9. IDEA统计代码量Statistic插件
  10. Vim终极指南:所思即所得