一、Security简介

1、基础概念

Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring的IOC,DI,AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为安全控制编写大量重复代码的工作。

2、核心API解读

1)、SecurityContextHolder

最基本的对象,保存着当前会话用户认证,权限,鉴权等核心数据。SecurityContextHolder默认使用ThreadLocal策略来存储认证信息,与线程绑定的策略。用户退出时,自动清除当前线程的认证信息。

初始化源码:明显使用ThreadLocal线程。

private static void initialize() {if (!StringUtils.hasText(strategyName)) {strategyName = "MODE_THREADLOCAL";}if (strategyName.equals("MODE_THREADLOCAL")) {strategy = new ThreadLocalSecurityContextHolderStrategy();} else if (strategyName.equals("MODE_INHERITABLETHREADLOCAL")) {strategy = new InheritableThreadLocalSecurityContextHolderStrategy();} else if (strategyName.equals("MODE_GLOBAL")) {strategy = new GlobalSecurityContextHolderStrategy();} else {try {Class<?> clazz = Class.forName(strategyName);Constructor<?> customStrategy = clazz.getConstructor();strategy = (SecurityContextHolderStrategy)customStrategy.newInstance();} catch (Exception var2) {ReflectionUtils.handleReflectionException(var2);}}++initializeCount;
}

2)、Authentication

源代码

public interface Authentication extends Principal, Serializable {Collection<? extends GrantedAuthority> getAuthorities();Object getCredentials();Object getDetails();Object getPrincipal();boolean isAuthenticated();void setAuthenticated(boolean var1) throws IllegalArgumentException;
}

源码分析

1)、getAuthorities,权限列表,通常是代表权限的字符串集合;
2)、getCredentials,密码,认证之后会移出,来保证安全性;
3)、getDetails,请求的细节参数;
4)、getPrincipal, 核心身份信息,一般返回UserDetails的实现类。

3)、UserDetails

封装了用户的详细的信息。

public interface UserDetails extends Serializable {Collection<? extends GrantedAuthority> getAuthorities();String getPassword();String getUsername();boolean isAccountNonExpired();boolean isAccountNonLocked();boolean isCredentialsNonExpired();boolean isEnabled();
}

4)、UserDetailsService

实现该接口,自定义用户认证流程,通常读取数据库,对比用户的登录信息,完成认证,授权。

public interface UserDetailsService {UserDetails loadUserByUsername(String var1) throws UsernameNotFoundException;
}

5)、AuthenticationManager

认证流程顶级接口。可以通过实现AuthenticationManager接口来自定义自己的认证方式,Spring提供了一个默认的实现,ProviderManager。

public interface AuthenticationManager {Authentication authenticate(Authentication var1) throws AuthenticationException;
}

二、与SpringBoot2整合

1、流程描述

1)、三个页面分类,page1、page2、page3
2)、未登录授权都不可以访问
3)、登录后根据用户权限,访问指定页面
4)、对于未授权页面,访问返回403:资源不可用

2、核心依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>

3、核心配置

/*** EnableWebSecurity注解使得SpringMVC集成了Spring Security的web安全支持*/
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {/*** 权限配置*/@Overrideprotected void configure(HttpSecurity http) throws Exception {// 配置拦截规则http.authorizeRequests().antMatchers("/").permitAll().antMatchers("/page1/**").hasRole("LEVEL1").antMatchers("/page2/**").hasRole("LEVEL2").antMatchers("/page3/**").hasRole("LEVEL3");// 配置登录功能http.formLogin().usernameParameter("user").passwordParameter("pwd").loginPage("/userLogin");// 注销成功跳转首页http.logout().logoutSuccessUrl("/");//开启记住我功能http.rememberMe().rememberMeParameter("remeber");}/*** 自定义认证数据源*/@Overrideprotected void configure(AuthenticationManagerBuilder builder) throws Exception{builder.userDetailsService(userDetailService()).passwordEncoder(passwordEncoder());}@Beanpublic UserDetailServiceImpl userDetailService (){return new UserDetailServiceImpl () ;}/*** 密码加密*/@Beanpublic BCryptPasswordEncoder passwordEncoder(){return new BCryptPasswordEncoder();}/** 硬编码几个用户@Autowiredpublic void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {auth.inMemoryAuthentication().withUser("spring").password("123456").roles("LEVEL1","LEVEL2").and().withUser("summer").password("123456").roles("LEVEL2","LEVEL3").and().withUser("autumn").password("123456").roles("LEVEL1","LEVEL3");}*/
}

4、认证流程

@Service
public class UserDetailServiceImpl implements UserDetailsService {@Resourceprivate UserRoleMapper userRoleMapper ;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {// 这里可以捕获异常,使用异常映射,抛出指定的提示信息// 用户校验的操作// 假设密码是数据库查询的 123String password = "$2a$10$XcigeMfToGQ2bqRToFtUi.sG1V.HhrJV6RBjji1yncXReSNNIPl1K";// 假设角色是数据库查询的List<String> roleList = userRoleMapper.selectByUserName(username) ;List<GrantedAuthority> grantedAuthorityList = new ArrayList<>() ;/** Spring Boot 2.0 版本踩坑* 必须要 ROLE_ 前缀, 因为 hasRole("LEVEL1")判断时会自动加上ROLE_前缀变成 ROLE_LEVEL1 ,* 如果不加前缀一般就会出现403错误* 在给用户赋权限时,数据库存储必须是完整的权限标识ROLE_LEVEL1*/if (roleList != null && roleList.size()>0){for (String role : roleList){grantedAuthorityList.add(new SimpleGrantedAuthority(role)) ;}}return new User(username,password,grantedAuthorityList);}
}

5、测试接口

@Controller
public class PageController {/*** 首页*/@RequestMapping("/")public String index (){return "home" ;}/*** 登录页*/@RequestMapping("/userLogin")public String loginPage (){return "pages/login" ;}/*** page1 下页面*/@PreAuthorize("hasAuthority('LEVEL1')")@RequestMapping("/page1/{pageName}")public String onePage (@PathVariable("pageName") String pageName){return "pages/page1/"+pageName ;}/*** page2 下页面*/@PreAuthorize("hasAuthority('LEVEL2')")@RequestMapping("/page2/{pageName}")public String twoPage (@PathVariable("pageName") String pageName){return "pages/page2/"+pageName ;}/*** page3 下页面*/@PreAuthorize("hasAuthority('LEVEL3')")@RequestMapping("/page3/{pageName}")public String threePage (@PathVariable("pageName") String pageName){return "pages/page3/"+pageName ;}
}

6、登录界面

这里要和Security的配置文件相对应。

<div align="center"><form th:action="@{/userLogin}" method="post">用户名:<input name="user"/><br>密&nbsp;&nbsp;&nbsp;码:<input name="pwd"><br/><input type="checkbox" name="remeber"> 记住我<br/><input type="submit" value="Login"></form>
</div>

三、源代码地址

GitHub地址:知了一笑
https://github.com/cicadasmile/middle-ware-parent
码云地址:知了一笑
https://gitee.com/cicadasmile/middle-ware-parent


SpringBoot2.0 整合 SpringSecurity 框架,实现用户权限安全管理相关推荐

  1. SpringBoot2.0 整合 JWT 框架,解决Token跨域验证问题

    SpringBoot2.0 整合 JWT 框架,解决Token跨域验证问题 参考文章: (1)SpringBoot2.0 整合 JWT 框架,解决Token跨域验证问题 (2)https://www. ...

  2. SpringBoot2.0 整合 Dubbo框架 ,实现RPC服务远程调用

    一.Dubbo框架简介 1.框架依赖 图例说明: 1)图中小方块 Protocol, Cluster, Proxy, Service, Container, Registry, Monitor 代表层 ...

  3. SpringBoot2.0 整合 Shiro 框架,实现用户权限管理

    GitHub源码地址:知了一笑 https://github.com/cicadasmile/middle-ware-parent 一.Shiro简介 1.基础概念 Apache Shiro是一个强大 ...

  4. SpringBoot2.0 整合 ElasticSearch框架,实现高性能搜索引擎

    本文源码 GitHub:知了一笑 https://github.com/cicadasmile/spring-boot-base 一.安装和简介 ElasticSearch是一个基于Lucene的搜索 ...

  5. SpringBoot2.0 整合 QuartJob ,实现定时器实时管理

    一.QuartJob简介 1.一句话描述 Quartz是一个完全由java编写的开源作业调度框架,形式简易,功能强大. 2.核心API (1).Scheduler 代表一个 Quartz 的独立运行容 ...

  6. SpringBoot2.0 整合 Swagger2 ,构建接口管理界面

    一.Swagger2简介 1.Swagger2优点 整合到Spring Boot中,构建强大RESTful API文档.省去接口文档管理工作,修改代码,自动更新,Swagger2也提供了强大的页面测试 ...

  7. SpringCloud、SpringBoot2.0 整合Oauth2 (四) 配置文件快速配置url过滤

    SpringBoot2.0 整合Oauth2 (四) 配置文件快速配置url过滤 文章目录 SpringBoot2.0 整合Oauth2 (四) 配置文件快速配置url过滤 1.添加url过滤配置 2 ...

  8. SpringBoot2.0 整合 Redis集群 ,实现消息队列场景

    本文源码 GitHub地址:知了一笑 https://github.com/cicadasmile/middle-ware-parent 一.Redis集群简介 1.RedisCluster概念 Re ...

  9. SpringBoot2.0整合多数据源拆分

    前言 本文环境承接springboot2.0整合使用mybatis(数据访问篇) 一.什么是多数据源 公司分为两个数据库,一个数据库专门存放共同配置文件,一个数据库垂直业务数据库.垂直根据业务划分具体 ...

最新文章

  1. 看完这部缓存进化史,还不懂缓存,请给我差评
  2. jQuery Validate 表单验证插件----自定义校验结果样式
  3. 计算机辅助语言和计算语言学关系,建构主义理论视角下计算机辅助语言学习环境对留学生学习汉语动机的影响——以广西大学泰国留学生为例-语言学及应用语言学专业论文.docx...
  4. 我在网易云信是如何做运维的?
  5. Debug Android with Android phone.
  6. DirectUI的初步分析-转
  7. qq android 哪个版本好用吗,Android QQ轻聊版好用吗?
  8. 微信小程序 canvas API
  9. Axis2创建web service(一) - eclipse安装Axis2插件
  10. 【融职培训】Web前端学习 第11章 微信开发4 JS-SDK接口
  11. USB over Network通过本地网络或 Internet 共享的远程 USB 设备
  12. TortoiseSVN文件夹及文件图标不显示解决方法
  13. 快速可靠网络传输协议 KCP
  14. 安装google输入法后,左shift键不能切换中英文
  15. Git 到底是个什么东西?
  16. 电脑无法打开计算机是怎么回事,电脑的office软件突然打不开怎么办
  17. TCP劫持及反弹shell攻击
  18. 詹姆斯·克拉克·麦克斯韦: 麦克斯韦方程的历史
  19. 论文参考文献的引用及自动编号
  20. powwr shell_WindowsPowerShell官方下载-WindowsPowerShell下载-华军软件园

热门文章

  1. JS学习笔记2-JavaScript 语法
  2. java final属性
  3. LeedCode篇:876. 链表的中间结点
  4. (数据库系统概论|王珊)第四章数据库安全性:习题
  5. QTableWidget与QTableView的区别
  6. 编译原理中LL(1)分析程序的设计---用c++程序语言实现
  7. QT界面布局、系统信号和槽、启动进程、EDIT回车快捷键、正常信号和槽、QMessageBox、UIC使用(界面重新生成)
  8. Linux系统编程:循环创建N个子线程并顺序输出
  9. 【DB2】delete大表不记录日志的正确操作
  10. 开发代码code中变量替换