Spring Security实现登录权限控制,记住我等功能
文章目录
- 1.Spring Security简介
- 2.登录权限控制
- 2.1.基本功能
- 2.2.登录和未登录导航栏显示
- 2.3.根据权限显示不同页面功能
- 3.定制登录页和记住我功能
- 3.1.定制登录页
- 3.1.记住我
1.Spring Security简介
Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架。它实际上是保护基于spring的应用程序的标准。
Spring Security是一个框架,侧重于为Java应用程序提供身份验证和授权。与所有Spring项目一样,Spring安全性的真正强大之处在于它可以轻松地扩展以满足定制需求
Spring Security 是针对Spring项目的安全框架,也是Spring Boot底层安全模块默认的技术选型,他可以实现强大的Web安全控制,对于安全控制,我们仅需要引入 spring-boot-starter-security 模块,进行少量的配置,即可实现强大的安全管理!
记住几个类:
- WebSecurityConfigurerAdapter:自定义Security策略
AuthenticationManagerBuilder:自定义认证策略
@EnableWebSecurity:开启WebSecurity模式
Spring Security的两个主要目标是 “认证” 和 “授权”(访问控制)。
“认证”(Authentication)
身份验证是关于验证您的凭据,如用户名/用户ID和密码,以验证您的身份。
身份验证通常通过用户名和密码完成,有时与身份验证因素结合使用。
“授权” (Authorization)
授权发生在系统成功验证您的身份后,最终会授予您访问资源(如信息,文件,数据库,资金,位置,几乎任何内容)的完全权限。
这个概念是通用的,而不是只在Spring Security 中存在。
2.登录权限控制
2.1.基本功能
1.引入Spring Security启动器
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>
2.编写 Spring Security 配置类
@EnableWebSecurity //开启WebSecurity模式
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {//设置请求的授权规则,首页所有人可以访问,level1,2,3分别设置拥有不同权限的人访问http.authorizeRequests().antMatchers("/").permitAll().antMatchers("/level1/**").hasRole("vip1").antMatchers("/level2/**").hasRole("vip2").antMatchers("/level3/**").hasRole("vip3");//开启自动配置的登录功能,没有权限访问的页面会重定向到登录页面http.formLogin();http.csrf().disable();//关闭csrf功能:跨站请求伪造,默认只能通过post方式提交logout请求//开启了注销功能,注销成功跳转到主页http.logout().logoutSuccessUrl("/");}@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {//定义认证规则,定义一些拥有权限的角色,可以在内存中定义,也可以到数据库中拿//security5.0以上版本新增了许多加密方式,如果不使用加密方式会报500错误。auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder()).withUser("zhangxiaofeng").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1").and().withUser("root").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1","vip2","vip3");}
}
没有登录的情况下,访问除主页以外的页面会直接重定向到登录页面
上面没有用到数据库,这里是官网的关于数据库引用角色的方式。
2.2.登录和未登录导航栏显示
如果已登录,导航栏显示用户名以及其权限和注销,如果未登录则只显示登录按钮
需要用到thymeleaf功能
先导入thymeleaf和springsecurity的整合包
<!-- https://mvnrepository.com/artifact/org.thymeleaf.extras/thymeleaf-extras-springsecurity4 --><dependency><groupId>org.thymeleaf.extras</groupId><artifactId>thymeleaf-extras-springsecurity5</artifactId></dependency>
前端页面引入命名空间
<!--引入thymeleaf-SpringSecurity的名称空间-->
<html xmlns:th="http://www.thymeleaf.org"xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
修改导航栏,增加判断
<!--未登录--><div sec:authorize="!isAuthenticated()"><a class="item" th:href="@{/login}"><i class="address card icon"></i> 登录</a></div><!-- 如果已登录--><div sec:authorize="isAuthenticated()"><a class="item" th:href="@{/login}"><i class="address card icon"></i>用户名:<span sec:authentication="principal.username"></span>角色: <span sec:authentication="principal.authorities"></span></a></div><div sec:authorize="isAuthenticated()"><a class="item" th:href="@{/logout}"><i class="sign-out icon"></i> 注销</a></div>
测试
未登录时
已登录时
2.3.根据权限显示不同页面功能
前端页面添加sec:authorize="hasRole(‘status’) 来控制页面展示
<div class="column" sec:authorize="hasRole('vip1')"><div class="ui raised segment"><div class="ui"><div class="content"><h5 class="content">Level 1</h5><hr><div><a th:href="@{/level1/1}"><i class="bullhorn icon"></i> Level-1-1</a></div><div><a th:href="@{/level1/2}"><i class="bullhorn icon"></i> Level-1-2</a></div><div><a th:href="@{/level1/3}"><i class="bullhorn icon"></i> Level-1-3</a></div></div></div></div></div><div class="column" sec:authorize="hasRole('vip2')"><div class="ui raised segment"><div class="ui"><div class="content"><h5 class="content">Level 2</h5><hr><div><a th:href="@{/level2/1}"><i class="bullhorn icon"></i> Level-2-1</a></div><div><a th:href="@{/level2/2}"><i class="bullhorn icon"></i> Level-2-2</a></div><div><a th:href="@{/level2/3}"><i class="bullhorn icon"></i> Level-2-3</a></div></div></div></div></div><div class="column" sec:authorize="hasRole('vip3')"><div class="ui raised segment"><div class="ui"><div class="content"><h5 class="content">Level 3</h5><hr><div><a th:href="@{/level3/1}"><i class="bullhorn icon"></i> Level-3-1</a></div><div><a th:href="@{/level3/2}"><i class="bullhorn icon"></i> Level-3-2</a></div><div><a th:href="@{/level3/3}"><i class="bullhorn icon"></i> Level-3-3</a></div></div></div></div></div>
root角色拥有所有权限显示所有页面
zhangxiaofneg角色只有vip1权限,所以只显示level1功能
3.定制登录页和记住我功能
3.1.定制登录页
在SecurityConfig中formLogin添加loginPage路径,并且设置用户名和密码的参数和前端name相同。
http.formLogin().loginPage("/toLogin").usernameParameter("username").passwordParameter("password");
修改首页跳转url
<a class="item" th:href="@{/toLogin}"><i class="address card icon"></i> 登录</a>
修改form表单提交地址,注意这里的提交方式一定要为post
源码关于这个的说明
<form th:action="@{/toLogin}" method="post"><div class="field"><label>Username</label><div class="ui left icon input"><input type="text" placeholder="Username" name="username"><i class="user icon"></i></div></div><div class="field"><label>Password</label><div class="ui left icon input"><input type="password" name="password"><i class="lock icon"></i></div></div><div class="field"><input type="checkbox" name="remember">记住我</div><input type="submit" class="ui blue submit button" value="登录"/></form>
测试:
3.1.记住我
在配置类中添加rememberMe,设置前端参数名。
//开启记住我功能http.rememberMe().rememberMeParameter("remember");
选择记住我登录时会增加一个cookie,默认保存14天。下次进入主页时会自动登录,注销后自动删除cookie
Spring Security实现登录权限控制,记住我等功能相关推荐
- spring security 认证与权限控制
目录 1. 使用授权和认证的必要性 2. spring security 与 shiro 与 过滤器,拦截器 3. 具体配置使用 项目地址: https://github.com/sevenyoung ...
- 动态参数 maven_Spring Security 动态url权限控制(三)
一.前言 本篇文章将讲述Spring Security 动态分配url权限,未登录权限控制,登录过后根据登录用户角色授予访问url权限 基本环境 spring-boot 2.1.8 mybatis-p ...
- Spring Security + JWT实现权限管理
1 写在之前 本博客主要使用Spring Boot 整合Spring Security + JWT实现权限管理,利用JWT工具生成token,返回给登录接口.在访问其他接口时,采用Bearer Tok ...
- spring Security 重复登录配置无效的问题
关于spring Security重复登录的配置,百度一大堆,我这里就不啰嗦了. 今天碰到 按照网上的配置,但是 感觉配置无效,同一用户还是可以登录,不知道为什么,开始以为是自己配置的又问题.再三确认 ...
- Spring Security自定义登录验证及登录返回结果
Spring Security自定义登录验证及登录返回结果 一.功能描述 二.处理逻辑 简单流程 自定义UserDetails 自定义UserDetailsDAO 自定义UserDetailsServ ...
- spring security+jwt 登录认证
spring security+jwt 登录认证 1.综述 2.版本与环境 3.架构 4.数据库认证逻辑图 5.案例 security+jwt 5.1引入依赖 5.2新建工具类 5.2新建组件类 5. ...
- Keycloak简单几步实现对Spring Boot应用的权限控制,程序员Java基础案例教程
关注并星标 码农小胖哥,第一时间获取相关干货文章. 客户端 === 相信不少同学用过微信开放平台.蚂蚁开放平台.首先我们需要在这些开放平台上注册一个客户端以获取一套类似用户名和密码的凭证.有的叫app ...
- Spring Security 中的权限注解很神奇吗?
最近有个小伙伴在微信群里问 Spring Security 权限注解的问题: 很多时候事情就是这么巧,松哥最近在做的 tienchin 也是基于注解来处理权限问题的,所以既然大家有这个问题,咱们就一块 ...
- Spring Security默认登录页面
使用Spring Security作为权限管理模块的小伙伴们一定醉心于其极少的配置即可满足权限管理需求,以及比springMVC更简洁的filter配置. 在刚开始技术验证的demo阶段相信很多人试过 ...
最新文章
- IIS 7.0的ASP.NET应用程序生命周期概述
- 如何配置php的ip地址吗,如何手动配置IP地址及防火墙设置
- python模拟火车订票系统_如何用python编写火车抢票助手
- 活水亭观书有感其一_如何将iPad置于“信息亭”模式,将其限制为单个应用程序...
- 火狐浏览器账号登录步骤详解
- 一波圣诞美陈设计素材,值得收藏哦!
- 判断点在直线的哪一侧_【倒车入库】车身是否“正直”该怎么判断?
- 砸入近 30 亿美元后,马斯克拒绝加入 Twitter 董事会
- Salesforce正面叫板微软Office:5.82亿美元收购Quip
- android MySQL servlet_使用MySQL和Servlet编写Android接口样例
- 车路协同发展挑战与影响解析
- Mac: Mac 截长屏
- 重载和重写(覆盖)的区别
- Windows更新 “Install error - 0x80070001”?
- kui 组件化库思路(来啦,老弟,持续更新哦,部署gitpages,添加issue)
- pyenv、ipython、jupyter的安装使用
- 飞桨EasyDL闪退解决方法
- 通过面积证明:两个函数相乘 / 相除的导数为什么长成这样?
- Xmind2021分享
- 说不清心里对于这个孩子是什么样的感情
热门文章
- C++ Primer 5th笔记(10)chapter10 泛型算法 :bind
- java结丹期(16)----javaweb(maven(2))
- 软件工程方法论为我们经软件开发有多大用处?谈谈你的看法。
- OPTEE的内存管理 :页表的创建过程
- [architecture]-DBG、DMB、DSB 和 ISB指令介绍
- typedef的详细用法
- 设计模式C++实现(5)——原型模式、模板方法模式
- 【Apache 】 遇到的问题
- 使用request对象进行数据传递
- 1030 Travel Plan (30 分) 【难度: 中 / 知识点: 最短路】