Spring Security进行权限控制
一、SpringSecurity介绍
- 简介
SpringSecurity是一个专注于java应用程序提供身份认证和授权的框架,它的强大之处在于它可以轻松扩展以满足自定义的需求 - 特征
– 对身份的认证和授权提供全面的、可扩展的支持。
– 防止各种攻击,如会话固定攻击、点击劫持、csrf攻击等。
– 支持与Servlet API,Spring MVC等web技术支持 - SpringSecurity底层是通过11钟过滤器进行实现,属于JavaEE层面
SpringSecurity底层详解网站推荐:http://www.spring4all.com/article/428
二、利用SpringSecurity进行权限控制
引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>
编写config类
对未登录,权限不足以及退出时进行过滤
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter implements CommunityConstant {//忽略对静态资源的拦截@Overridepublic void configure(WebSecurity web) throws Exception {web.ignoring().antMatchers("/resources/**");}@Overrideprotected void configure(HttpSecurity http) throws Exception {//授权http.authorizeRequests()//需要授权的请求.antMatchers("/user/setting","/user/upload","/discuss/add","/comment/add/**","/letter/**","/notice/**","/like","/follow","/followee/**","/follower/**")//上述请求需要的身份.hasAnyAuthority(AUTHORITY_USER,AUTHORITY_ADMIN,AUTHORITY_MODERATOR)//拥有身份时允许的行为.anyRequest().permitAll();//权限不够时的操作http.exceptionHandling()//没有登陆.authenticationEntryPoint(new AuthenticationEntryPoint() {@Overridepublic void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {//当请求头是x-requested-with=XMLHttpRequest时说明是异步请求,返回JSON字符串String xRequestedWith = request.getHeader("x-requested-with");//if (xRequestedWith.equals("XMLHttpRequest")) {会报空指针异常if ("XMLHttpRequest".equals(xRequestedWith)) {response.setContentType("application/plain;charset=utf-8");PrintWriter writer = response.getWriter();writer.write(CommunityUtil.getJSONString(403, "您还没有登录!"));} else {response.sendRedirect(request.getContextPath() + "/login");}}})//权限不足.accessDeniedHandler(new AccessDeniedHandler() {@Overridepublic void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {//当请求头是x-requested-with=XMLHttpRequest时说明是异步请求,返回JSON字符串String xRequestedWith = request.getHeader("x-requested-with");//if (xRequestedWith.equals("XMLHttpRequest")) {会报空指针异常if ("XMLHttpRequest".equals(xRequestedWith)) {response.setContentType("application/plain;charset=utf-8");PrintWriter writer = response.getWriter();writer.write(CommunityUtil.getJSONString(403, "您没有访问的权限!"));} else {response.sendRedirect(request.getContextPath() + "/denied");}}});//security底层默认会拦截/logout请求,进行退出处理,覆盖他的逻辑,才能执行我们自己的推出代码http.logout().logoutUrl("/securitylogout");//写一个没有的请求欺骗springSecurity}
}
if (xRequestedWith.equals(“XMLHttpRequest”)) 会报空指针异常,因为xRequestedWith可能为null
改为if (“XMLHttpRequest”.equals(xRequestedWith)) 防止此错误
编写userService类实现获取用户权限的方法
@Override
public Collection<? extends GrantedAuthority> getAuthorities(int userId) {//获得当前登录用户User user = this.findUserById(userId);//将用户权限装入ListList<GrantedAuthority> list = new ArrayList<>();list.add(new GrantedAuthority() {@Overridepublic String getAuthority() {switch (user.getType()){case 1:return AUTHORITY_ADMIN;case 2:return AUTHORITY_MODERATOR;default:return AUTHORITY_USER;}}});return list;
}
将认证信息写入过滤器
写入过滤器的preHandle方法,在每一次请求前都调用
//构建用户认证的结果,并存入SecurityContext,以便于security进行授权
Authentication authentication = new UsernamePasswordAuthenticationToken(user, user.getPassword(), userService.getAuthorities());
SecurityContextHolder.setContext(new SecurityContextImpl(authentication));
并在请求结束时的afterCompletion方法中清楚认证
SecurityContextHolder.clearContext();
防止csrf攻击
- csrf攻击:
在用户提交表单时,不法网站可能窃取用户提交的信息进行提交从而造成安全问题 - 解决办法
springsecurity中在用户同步提交表单时设置了一个隐藏的token,不但会对用户提交的信息进行核实,还会对token进行核实,在异步提交的时候则需要自行在前端加入token提交 - 异步请求时徐手动添加token的提交
<!--生成csrf令牌-->
<meta name="_csrf" th:content="${_csrf.token}">
<meta name="_csrf_header" th:content="${_csrf.headerName}">
//发送ajax请求前,将csrf令牌设置到请求的消息头中
var token = $("meta[name='_csrf']").attr("content");
var header = $("meta[name='_csrf_header']").attr("content");
$(document).ajaxSend(function (e, xhr, options) {xhr.setRequestHeader(header, token)
})
添加成功
三、整合前端模板
引入依赖
<dependency><groupId>org.thymeleaf.extras</groupId><artifactId>thymeleaf-extras-springsecurity5</artifactId>
</dependency>
前端引入
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
模块设置
<button type="button" class="btn btn-danger btn-sm " id="topBtn" th:disabled="${post.type==1}" sec:authorize="hasAnyAuthority('moderator')">置顶</button>
满足moderator权限时才显示
Spring Security进行权限控制相关推荐
- 基于Spring Security实现权限管理系统
基于Spring Security实现权限管理系统 稍微复杂一点的后台系统都会涉及到用户权限管理.何谓用户权限?我的理解就是,权限就是对数据(系统的实体类)和数据可进行的操作(增删查改)的集中管理.要 ...
- SpringBoot 精通系列-如何使用Spring Boot Security进行权限控制
导语 如何设计一个高效健全的安全策略是保证企业数据安全的的关键,笔者见过设计的比较优秀的安全管理策略也见过设计的比较Low的安全管理策略.如何保证高效的安全策略,在Java中Spring官方提供了 ...
- SpringSecurity系列(四) Spring Security 实现权限树形菜单
SpringSecurity系列(一) 初识 Spring Security SpringSecurity系列(二) Spring Security入门 SpringSecurity系列(三) Spr ...
- springboot整合security实现权限控制
1.建表,五张表,如下: 1.1.用户表 CREATE TABLE `t_sys_user` (`user_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT ...
- 一分钟搞定Spring AOP实现权限控制
Spring Aop就是我们常说的面向切面编程,它和IOC构成了spring体系的两大核心,玩明白了这两个,spring就算玩会了.. spring aop可以干很多事,他就类似于拦截器,能在你的目标 ...
- Spring Security 3.0控制一个帐号只允许登录一次的问题
Spring Security 3 自定义UserDetails后,控制一个帐号只能登录一次的功能不能起作用,原因出在自定义的UserDetails上: org.springframework.sec ...
- Spring security开发权限管理系统(一)
从今天起,我将使用SpringBoot+SpringBoot+Mybatis+Vue从到一开发一个系统. 今天将说明Spring Security+SpringBoot+Mybatis的结合 引入PO ...
- 基于Spring AOP实现权限控制
基于Spring AOP实现一个简单的接口权限 1.定义自定义注解 //注解的作用类型:方法.类 @Target({ElementType.METHOD,ElementType.TYPE}) @Ret ...
- Spring Security并发会话控制示例教程–如何限制Java JEE Web应用程序中的用户会话数...
如果您不知道, Spring安全性可能会限制用户可以拥有的会话数. 如果要开发Web应用程序,尤其是Java JEE中的安全Web应用程序 ,则必须提出与在线银行门户相似的要求,例如, 每个用户一次只 ...
最新文章
- 难以想象!未来十年,颠覆性技术将带来这些社会变革……
- 不给欧美科技公司封杀的机会,从换这个国产软件开始!
- Centos7系统启动流程
- 哈夫曼编码 译码java_基于Java的哈夫曼编码译码系统_报告毕业论文
- 通过C#/.NET API使用CNTK
- Silverlight:使用Storyboard控制动画--控制动画事件交互
- php扩展之redis
- outlook搜索栏跑到上面去了_Outlook邮箱批量下载邮件附件+快速复制文件名
- Android数据加密解密
- 一个简单的倒计时js插件
- python with as 用法_你在 Python 中常常写的 with..as.. 到底是个啥?
- Framehawk技术-思杰HDX
- carry函数在C语言中用法,动词carry用法小归纳
- [Jetson TX2] NVIDIA Jetson TX2 参数介绍
- python excel数据分析师职业技能_数据分析师=Excel+Python?其实不止!
- 关于依赖注入和依赖属性
- vba msgbox html 标签,VBA更改MsgBox中的文本颜色
- rtx服务器插件的作用,腾讯通RTX手机版插件介绍 - 有度帮助中心
- [24]Window PowerShell DSC学习系列---- 如何保护MOF文件里面存储的密码?
- 自学HTTP RCF体会
热门文章
- im4java裁剪图片之后再将图片在mongoDB上传下载图片
- VUE知识要点总结思维导图
- c语言程序设计秋考答案,南开《C语言程序设计》19秋期末考核【标准答案】
- 学会老板思维,用数据诊断优化业务!
- Linux小小白入门教程(十二):移动/复制命令
- 妇女节 | 卓然而立,绽放光芒!
- java利用Freemarker模板生成格式友好的doc或者docx文档
- Python遥感图像处理应用篇(二十五):Python+GDAL 波段组合
- 空中网第四季度净利润477万美元 同比降16%
- setCapture和releaseCapture