使用Spring Security进行自动登录验证
**
原文来自师兄的博客
**:
http://blog.csdn.net/df19900725/article/details/78085152
http://www.datalearner.com/blog/1051506310769424
在之前的博客使用SpringMVC创建Web工程并使用SpringSecurity进行权限控制的详细配置方法 中,我们描述了如何配置一个基于SpringMVC、SpringSecurity框架的网站系统。在这篇博客中,我们将继续描述如何使用Spring Security进行登录验证。 原文地址:http://www.datalearner.com/blog/1051506310769424 总结一下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)等不需要用户登录,但是需要经过过滤器(因为我们可能需要获取未登录用户的一些信息)。两种配置方式如下所示。最后我们使用
<form-login login-page="/signin" authentication-failure-url="/signin?login_error" default-target-url="/query"/>
这个配置来说明登录页面是”/signin”,即所有需要用户登录的页面,在用户未登录情况下需要跳转到这个页面,让用户登录。authentication-failure-url配置的是用户登录失败的页面,而default-target-url是配置用户登录成功后跳转的页面。
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/securityhttp://www.springframework.org/schema/security/spring-security-4.0.xsd"><!-- 配置为none的不经过任何spring的过滤器 --><http pattern="/resources/**" security="none" /><http pattern="/sitemap.xml" security="none" /><http pattern="/favicon.ico" security="none" /><!-- 配置为permitAll允许用户访问,但依然经过过滤器处理 --><http auto-config="true" use-expressions="true"><intercept-url pattern="/" access="permitAll" /><intercept-url pattern="/index*" access="permitAll" /><intercept-url pattern="/signin*" access="permitAll" /><intercept-url pattern="/login*" access="permitAll" /><intercept-url pattern="/register*" access="permitAll" /><intercept-url pattern="/invalidsession*" access="permitAll" /><intercept-url pattern="/404*" access="none" /><form-login login-page="/signin" authentication-failure-url="/signin?login_error" default-target-url="/query"/><logout logout-success-url="/query" delete-cookies="JSESSIONID" /><intercept-url pattern="/admin" access="hasRole('ROLE_ADMIN')" /><intercept-url pattern="/**" access="hasAnyRole('ROLE_ADMIN','ROLE_USER')" /><csrf disabled="true" /><access-denied-handler error-page="/403" /><remember-me data-source-ref="dataSource" token-validity-seconds="1209600" remember-me-parameter="remember-me" /><session-management invalid-session-url="/"> <concurrency-control max-sessions="1"/> </session-management></http><authentication-manager erase-credentials="false"><authentication-provider><password-encoder ref="bcryptEncoder" /><jdbc-user-service data-source-ref="dataSource" /></authentication-provider></authentication-manager><beans:bean id="messageSource"class="org.springframework.context.support.ReloadableResourceBundleMessageSource"><beans:property name="basenames"><beans:list><beans:value>classpath:myMessages</beans:value></beans:list></beans:property></beans:bean><beans:bean name="bcryptEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" /></beans:beans>
,表明登录的时候会对密码进行加密,那么后面我们写注册页面的时候必须要对密码加密之后才能存入数据库。 ### 三、创建登录/注册的页面 这里属于前台的范畴,如果我们要使用Spring Security自带的验证方法,需要在前台也配置一样的信息来获取验证需要的字段,如用户名和密码。所以这里也是需要注意的地方。具体的页面核心代码如下(我们的页面使用了Bootstrap的前端工具,所以要引入bootrap和jquery等外部样式和脚本语言才会正常显示,但是这些显示不会影响功能,核心的字段不变即可):
<div class="container"><!-- 页面切换代码 --><ul class="nav nav-tabs" id="loginTab" role="tablist"><li class="nav-item"><a class="nav-link active" id="home-tab" data-toggle="tab" href="#login" role="tab" aria-controls="home" aria-expanded="true">登录</a></li><li class="nav-item"><a class="nav-link" id="home-tab" data-toggle="tab" href="#register" role="tab" aria-controls="home" aria-expanded="true">注册</a></li></ul><div class="tab-content" id="myTabContent"><!-- 登录页面 --><div id="login" class="tab-pane fade show active" role="tabpanel" aria-labelledby="login-tab"><form class="form-signin" action="login" method="post"><label for="username" class="sr-only">Email address</label><input type="email" name="username" id="username" class="form-control" placeholder="邮件地址"><label for="password" class="sr-only">Password</label><input type="password" name="password" id="password" class="form-control" placeholder="密码"><button class="btn btn-lg btn-primary btn-block" type="submit">点击登录</button></form></div><!-- 注册页面 --><div id="register" class="tab-pane fade" role="tabpanel" aria-labelledby="register-tab"><div id="register_attention_alert_reg"></div><form class="form-signin" onsubmit="return register()" method="post"><label for="registerEmail" class="sr-only">Email address</label><input type="email" id="registerEmail" name="registerEmail" class="form-control" placeholder="邮件地址"><label for="registerPassword" class="sr-only">Password</label><input type="password" name="password" id="registerPassword" class="form-control" placeholder="密码"><label for="inputPassword2" class="sr-only">Password</label><input type="password" id="inputPasswordForRegister2" class="form-control" placeholder="请再次输入密码"><button class="btn btn-lg btn-primary btn-block" onclick="submit">点击注册</button></form></div></div></div>
这里有两个Tab页代码,一个是登录Tab一个是注册Tab。主要是登录的Tab要和Spring Security一致,即登录的处理应当是 login
,即 action="login"
,用户名的ID和name应该是 username
,而密码的应该是 password
,即提交给登录验证的两个参数应当是username和password,处理的请求页是 login
。
具体详细介绍请看师兄的原文。
使用Spring Security进行自动登录验证相关推荐
- Spring Security入门01-22 登录验证功能
课程链接:SpringSecurity框架教程 开始时间:2022-07-17 快速入门 搭建一个Spring Boot项目 添加基础依赖和创建启动类和controller controller @R ...
- Spring Security技术栈学习笔记(十三)Spring Social集成第三方登录验证开发流程介绍
开发第三方登录,我们必须首先要了解OAuth协议(本文所讲述的OAuth协议指的是OAuth2协议),本文首先简单介绍OAuth协议,然后基于Spring Social来阐述开发第三方登录需要做哪些准 ...
- Spring Security技术栈学习笔记(十四)使用Spring Social集成QQ登录验证方式
上一篇文章<Spring Security技术栈开发企业级认证与授权(十三)Spring Social集成第三方登录验证开发流程介绍>主要是介绍了OAuth2协议的基本内容以及Spring ...
- 使用Spring Security进行简单身份验证
朋友不允许朋友写用户身份验证. 厌倦了管理自己的用户? 立即尝试Okta的API和Java SDK. 在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护. 身份验证对于除了最基本的Web应 ...
- 使用Spring Security添加RememberMe身份验证
我在" 将社交登录添加到Jiwhiz博客"中提到,RememberMe功能不适用于Spring Social Security. 好吧,这是因为该应用程序现在不通过用户名和密码对用 ...
- Spring Security 3 Ajax登录–访问受保护的资源
我看过一些有关Spring Security 3 Ajax登录的博客,但是我找不到解决如何调用基于Ajax的登录的博客,匿名用户正在Ajax中访问受保护的资源. 问题 – Web应用程序允许匿名访问某 ...
- Spring Security OAuth2 单点登录和登出
文章目录 1. 单点登录 1.1 使用内存保存客户端和用户信息 1.1.1 认证中心 auth-server 1.1.2 子系统 service-1 1.1.3 测试 1.2 使用数据库保存客户端和用 ...
- spring security 自定义认证登录
spring security 自定义认证登录 1.概要 1.1.简介 spring security是一种基于 Spring AOP 和 Servlet 过滤器的安全框架,以此来管理权限认证等. 1 ...
- Spring Security在标准登录表单中添加一个额外的字段
概述 在本文中,我们将通过向标准登录表单添加额外字段来实现Spring Security的自定义身份验证方案. 我们将重点关注两种不同的方法,以展示框架的多功能性以及我们可以使用它的灵活方式. 我们的 ...
最新文章
- 错误:Script file ‘D:\software_install\Anaconda_install\Scripts\pip-script.py‘ is not present.完美解决方法
- java 铺地板问题_铺木地板的5大注意事项,我家接连踩坑接近“崩溃”,大家别再犯...
- geoserver发布瓦片数据_OpenLayers教程十八:多源数据加载之矢量切片
- vs2019 发行说明_如何计算发行说明
- C++中的字符串输入输出函数详解
- 修复linux bash破壳漏洞,Linux系统下如何检测并修复bash中的破壳漏洞​​
- LVS-DR负载均衡-02
- 常用破解教程仅供参考,仅供学习用途
- phpmyadmin 安装下载使用教程
- linux给文件夹添加查看密码是什么,Linux如何给文件夹设置密码
- Python“Non-ASCII character 'xe5' in file”报错问题(转)
- 基于SpringBoot的乡村医疗管理系统
- 20162330 第十周 蓝墨云班课 十字链表
- mysql 免安装版配置
- MES如何实现生产过程全追踪
- 正则表达式口诀 正则表达式学习工具
- 通过数据了解用户——数据在新品设计中的应用
- 怎么将word2016的背景色改成护眼绿?
- hiveSQL的小数取整
- drf第三讲——筛选、视图
热门文章
- Nginx限制连接数和下载速度
- Office文档上传后实时转换为PDF格式_图片文件上传后实时裁剪_实现在线预览Office文档
- 人工智能 - paddlepaddle飞桨 - 深度学习基础教程 - 情感分析
- 容器编排技术 -- Kubernetes kubectl 与 Docker 命令关系
- 人脸识别开源库face_recognition的简单介绍
- 电脑开机提示EFI Netword 0 for ipv4 boot failed的原因及解决方法
- C# 结合 PInvoke 对接 IP 摄像头的笔记
- C#LeetCode刷题-拓扑排序
- 通过接口字段名称反向猜测数据库列名
- freecodecamp_freeCodeCamp的学术诚信政策