一、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进行权限控制相关推荐

  1. 基于Spring Security实现权限管理系统

    基于Spring Security实现权限管理系统 稍微复杂一点的后台系统都会涉及到用户权限管理.何谓用户权限?我的理解就是,权限就是对数据(系统的实体类)和数据可进行的操作(增删查改)的集中管理.要 ...

  2. SpringBoot 精通系列-如何使用Spring Boot Security进行权限控制

    导语   如何设计一个高效健全的安全策略是保证企业数据安全的的关键,笔者见过设计的比较优秀的安全管理策略也见过设计的比较Low的安全管理策略.如何保证高效的安全策略,在Java中Spring官方提供了 ...

  3. SpringSecurity系列(四) Spring Security 实现权限树形菜单

    SpringSecurity系列(一) 初识 Spring Security SpringSecurity系列(二) Spring Security入门 SpringSecurity系列(三) Spr ...

  4. springboot整合security实现权限控制

    1.建表,五张表,如下: 1.1.用户表 CREATE TABLE `t_sys_user` (`user_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT ...

  5. 一分钟搞定Spring AOP实现权限控制

    Spring Aop就是我们常说的面向切面编程,它和IOC构成了spring体系的两大核心,玩明白了这两个,spring就算玩会了.. spring aop可以干很多事,他就类似于拦截器,能在你的目标 ...

  6. Spring Security 3.0控制一个帐号只允许登录一次的问题

    Spring Security 3 自定义UserDetails后,控制一个帐号只能登录一次的功能不能起作用,原因出在自定义的UserDetails上: org.springframework.sec ...

  7. Spring security开发权限管理系统(一)

    从今天起,我将使用SpringBoot+SpringBoot+Mybatis+Vue从到一开发一个系统. 今天将说明Spring Security+SpringBoot+Mybatis的结合 引入PO ...

  8. 基于Spring AOP实现权限控制

    基于Spring AOP实现一个简单的接口权限 1.定义自定义注解 //注解的作用类型:方法.类 @Target({ElementType.METHOD,ElementType.TYPE}) @Ret ...

  9. Spring Security并发会话控制示例教程–如何限制Java JEE Web应用程序中的用户会话数...

    如果您不知道, Spring安全性可能会限制用户可以拥有的会话数. 如果要开发Web应用程序,尤其是Java JEE中的安全Web应用程序 ,则必须提出与在线银行门户相似的要求,例如, 每个用户一次只 ...

最新文章

  1. 难以想象!未来十年,颠覆性技术将带来这些社会变革……
  2. 不给欧美科技公司封杀的机会,从换这个国产软件开始!
  3. Centos7系统启动流程
  4. 哈夫曼编码 译码java_基于Java的哈夫曼编码译码系统_报告毕业论文
  5. 通过C#/.NET API使用CNTK
  6. Silverlight:使用Storyboard控制动画--控制动画事件交互
  7. php扩展之redis
  8. outlook搜索栏跑到上面去了_Outlook邮箱批量下载邮件附件+快速复制文件名
  9. Android数据加密解密
  10. 一个简单的倒计时js插件
  11. python with as 用法_你在 Python 中常常写的 with..as.. 到底是个啥?
  12. Framehawk技术-思杰HDX
  13. carry函数在C语言中用法,动词carry用法小归纳
  14. [Jetson TX2] NVIDIA Jetson TX2 参数介绍
  15. python excel数据分析师职业技能_数据分析师=Excel+Python?其实不止!
  16. 关于依赖注入和依赖属性
  17. vba msgbox html 标签,VBA更改MsgBox中的文本颜色
  18. rtx服务器插件的作用,腾讯通RTX手机版插件介绍 - 有度帮助中心
  19. [24]Window PowerShell DSC学习系列---- 如何保护MOF文件里面存储的密码?
  20. 自学HTTP RCF体会

热门文章

  1. im4java裁剪图片之后再将图片在mongoDB上传下载图片
  2. VUE知识要点总结思维导图
  3. c语言程序设计秋考答案,南开《C语言程序设计》19秋期末考核【标准答案】
  4. 学会老板思维,用数据诊断优化业务!
  5. Linux小小白入门教程(十二):移动/复制命令
  6. 妇女节 | 卓然而立,绽放光芒!
  7. java利用Freemarker模板生成格式友好的doc或者docx文档
  8. Python遥感图像处理应用篇(二十五):Python+GDAL 波段组合
  9. 空中网第四季度净利润477万美元 同比降16%
  10. setCapture和releaseCapture