SpringBoot2.0 整合 SpringSecurity 框架,实现用户权限安全管理
程序员文章站
2023-11-12 08:43:16
一、Security简介 1、基础概念 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring的IOC,DI,AOP(面向切面编程)功能,为应用系统提供声明式 ......
一、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 { /** * 权限配置 */ @override protected 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"); } /** * 自定义认证数据源 */ @override protected void configure(authenticationmanagerbuilder builder) throws exception{ builder.userdetailsservice(userdetailservice()) .passwordencoder(passwordencoder()); } @bean public userdetailserviceimpl userdetailservice (){ return new userdetailserviceimpl () ; } /** * 密码加密 */ @bean public bcryptpasswordencoder passwordencoder(){ return new bcryptpasswordencoder(); } /* * 硬编码几个用户 @autowired public 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 { @resource private userrolemapper userrolemapper ; @override public userdetails loaduserbyusername(string username) throws usernamenotfoundexception { // 这里可以捕获异常,使用异常映射,抛出指定的提示信息 // 用户校验的操作 // 假设密码是数据库查询的 123 string 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> 密 码:<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 整合 Shiro 框架,实现用户权限管理
-
SpringBoot2.0 整合 SpringSecurity 框架,实现用户权限安全管理
-
jwt,spring security ,feign,zuul,eureka 前后端分离 整合 实现 简单 权限管理系统 与 用户认证的实现
-
ASP.NET MVC+EF框架+EasyUI实现权限管理系列(12)-实现用户异步登录和T4模板
-
SpringBoot2.0 整合 SpringSecurity 框架,实现用户权限安全管理
-
SpringBoot2.0 整合 Shiro 框架,实现用户权限管理
-
ASP.NET MVC+EF框架+EasyUI实现权限管理系列(12)-实现用户异步登录和T4模板