




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章SpringBoot安全框架——SpringSecurity基础SpringBoot实用教程(第4版)目录01SpringSecurity简介SpringSecurity简介SpringSecurity是一个专门针对Spring/SpringBoot应用系统的安全框架,它充分利用了Spring的依赖注入和AOP功能,为网站提供声明式的安全访问控制解决方案,使用这个框架进行开发,可省去为企业系统安全控制而不得不编写的大量重复代码,有助于提高可靠性和开发效率。SpringSecurity基于SpringAOP和Servlet过滤器,对访问用户进行认证和授权,除此之外,它还提供了ACLS、LDAP、JAAS、CAS等高级特性以满足复杂环境下的安全需求。认证(Authentication)和授权(Authorization)是SpringSecurity框架最为重要的两大核心功能,认证即确认用户是否可以访问当前系统;授权则进一步确定用户在当前系统下所拥有的操作权限。目录02SpringSecurity安全应用架构SpringSecurity安全应用架构SpringSecurity的安全应用架构如图6.1所示。SpringSecurity安全应用架构(1)认证访问用户的帐号信息被SpringSecurity封装于一个类型为UserDetails的实体内,由开发者编写的服务类通过实现UserDetailsService接口中的loadUserByUsername方法获取。认证时还可对用户密码进行加密,SpringSecurity5默认采用BCrypt算法的加密器,开发者也可以定义自己的加密器(通过实现PasswordEncoder)。最后,将开发好的服务类、加密器等组件注入(用@Bean)到SpringBoot容器中,再由作为配置类的WebSecurityConfigurerAdapter适配器将它们配置注册(用AuthenticationManagerBuilder)进系统即可开始正常工作并发挥认证作用。(2)授权对来访用户应用的权限规则写在另一个configure方法(HttpSecurity为参数)中,它可与前端的thymeleaf-extras-springsecurity5(Thymeleaf的SpringSecurity扩展支持)组件配合使用,以sec:系列标签判断登录用户的角色、获取用户名等,赋予不同权限的用户访问不一样的页面内容。第6章SpringBoot安全框架——用户认证目录01安全框架中的用户1.内存用户2.JDBC数据源用户3.通用用户安全框架中的用户1.内存用户使用AuthenticationManagerBuilder的inMemoryAuthentication方法即可添加内存中的临时用户,并可给其指定角色和权限。但此种方式多在开发和测试阶段用于快速验证需求,正式上线运行的系统一般不会采用,因为内存空间毕竟有限,且会占用JVM的内存,降低性能。2.JDBC数据源用户通过JDBC获取用户信息,直接指定dataSource(数据源)即可,这种方式下是由SpringSecurity默认了数据库的结构,在JDBC持久层实现中定义好默认的用户及其角色权限获取的SQL语句,当然开发者也可以自定义查询用户和权限的SQL语句。此种方式无法适应多种多样的数据库类型,因此用得也不多。安全框架中的用户3.通用用户这是普遍采用的方式,用户信息和权限的获取可通过各种不同的持久层框架,用户信息既可存放在关系数据库中,也可存于非关系型数据库,非常灵活。使用通用用户必须由开发者自定义实现UserDetailsService接口的类,并重写其中的loadUserByUsername方法査询对应的用户和权限。实际上,上面内存中的用户及JDBC数据源用户也都是UserDetailsService的实现,只不过是由SpringSecurity框架提供的现成默认实现,供特殊情况下有需要时使用而已。目录02认证信息的获取1.UserDetails用户实体2.UserDetailsService接口认证信息的获取1.UserDetails用户实体UserDetails是SpringSecurity的用户实体类,专用于存储用户名、密码、权限等信息,它以框架中一个核心接口的形式提供给开发者,该接口中定义了一些可以获取用户名、密码、权限等与认证相关信息的方法,如下:StringgetUsername():返回用户名,无法返回则显示为null。StringgetPassword():返回密码,无法返回则显示为null。booleanisEnabled():用户是否被禁用。禁用的用户不能进行身份认证。booleanisAccountNonLocked():用户帐号是否被锁定或解锁,锁定的用户无法进行身份认证。booleanisAccountNonExpired():用户帐号是否过期,过期无法认证。booleanisCredentialsNonExpired():用户凭据(密码)是否过期,过期则无法认证。认证信息的获取2.UserDetailsService接口SpringSecurity提供了一个UserDetailsService接口,通过它可以获取用户信息,而这个接口中只有一个loadUserByUsername方法需要实现用来根据用户名加载相关信息,该方法定义返回一个UserDetails类型的接口对象,其中就包含了用户的各项信息,包括用户名、密码、权限、是否启用、是否被锁定、是否过期等。登录认证时,SpringSecurity将通过UserDetailsService的loadUserByUsername方法获取对应的UserDetails实体对象进行认证。第6章SpringBoot安全框架——请求授权SpringBoot实用教程(第4版)请求授权在安全应用架构中,配置类继承了WebSecurityConfigurerAdapter适配器类,并覆盖了其configure(AuthenticationManagerBuilder)方法,除此之外,适配器中还提供了另外一个方法,那就是configure(HttpSecurity),通过它便能够实现对于不同角色用户赋予不同权限的功能。configure(HttpSecurity)方法使用其参数HttpSecurity的authorizeRequests()方法的子节点给指定用户授权访问URL的模式。因为适配器类已经提供了configure(HttpSecurity)方法的默认实现,所以通常情况下,只要是通过了认证的用户便可以访问所有的请求地址。还可以通过formLogin方法配置默认的登录页面、失败转向页面,通过httpBasic方法启用浏览器的HTTP基础认证方式。请求授权在默认情况下,只要是登录了的用户,其一切的请求都会畅通无阻,但这样在实际应用中是很不安全的,毕竟不同的用户有着不同的角色,必须根据角色来授予不一样的权限才行。因此通常需要在configure(HttpSecurity)方法中自定义一系列安全访问的规则,可以通过antmatchers方法使用Ant风格或者正则式来匹配URL路径,然后针对当前用户的信息对请求路径进行安全处理,SpringSecurity提供了许多安全处理方法,具体如表6.1所示。安全处理方法用途anyRequest()匹配所有请求路径authenticated()用户登录后可访问formLogin()启用安全框架默认的登录页面httpBasic()启用浏览器的HTTP基础认证permitAll()用户可任意访问anonymous()匿名可访问access(String)SpringEL表达式结果为true时可访问rememberMe()允许通过了remember-me功能认证的用户访问fullyAuthenticated()用户只有在完全(非remember-me)认证的情况下可访问denyAll()不允许任何访问and()连接词,并取消之前限定的前提规则not()对其他方法的访问采取求反hasAuthority(String)用户是给定的角色才允许访问(参数字符串表示角色)hasAnyAuthority(String...)只要用户具有给定角色中的任意一个就允许访问(参数字符串指定多个角色)hasRole(String)将访问权限授予一个角色(角色名会自动加前缀“ROLE_”)hasAnyRole(String...)将访问权限授予多个角色(角色名会自动加前缀“ROLE_”)hasIpAddress(String)用户来自给定的IP才允许访问(参数字符串表示IP地址)第6章SpringBoot安全框架——安全应用实例SpringBoot实用教程(第4版)安全应用实例【实例6.1】运用SpringSecurity安全框架实现“商品信息管理系统”登录功能。根据不同用户角色显示不同的内容界面,若为商家登录,显示“商品管理”表单;若为顾客登录,则显示“商品浏览”列表。本例与【实例2.6】功能上类同,但这里应用了安全框架的功能而非.properties配置文件来管理和验证不同角色的用户。1.准备数据库表本例在MySQL数据库中存储登录用户的信息,但SpringSecurity框架要求用户、角色及关联数据必须按一定的格式保存在以特定方式关联的多个表中,故先要来创建相关的表及录入测试用样本记录。通过NavicatPremium连上MySQL,在其查询编辑器中执行SQL语句准备表和数据。(1)访客表(visitor)该表用于保存来访的用户帐号信息(用户名和密码),执行SQL语句:USEnetshop;CREATETABLEvisitor( id int NOTNULLPRIMARYKEY, /*访客号*/ username varchar(16)NOTNULL, /*用户名*/ password varchar(12) NOTNULL /*密码*/
);INSERTINTOvisitor(id,username,password)VALUES(1,'SXLC001A','888');INSERTINTOvisitor(id,username,password)VALUES(2,'','abc123');安全应用实例(2)角色表(role)该表用于保存角色信息,本例设置了两种角色,角色名分别是ROLE_SUP(商家)和ROLE_USER(顾客),执行SQL语句:USEnetshop;CREATETABLErole( id int NOTNULLPRIMARYKEY, /*角色号*/ name varchar(10) NOTNULL /*角色名*/);INSERTINTOrole(id,name)VALUES(1,'ROLE_SUP');INSERTINTOrole(id,name)VALUES(2,'ROLE_USER');安全应用实例(3)访客-角色关联表(visitor_roles)该表用于记录访客表中用户帐号与角色表中角色之间的对应关系,执行SQL语句:USEnetshop;CREATETABLEvisitor_roles( visitor_id int NOTNULL, /*访客号*/ roles_id int NOTNULL, /*角色号*/ FOREIGNKEY(visitor_id)REFERENCESvisitor(id) ONDELETERESTRICTONUPDATERESTRICT, FOREIGNKEY(roles_id)REFERENCESrole(id) ONDELETERESTRICTONUPDATERESTRICT);INSERTINTOvisitor_roles(visitor_id,roles_id)VALUES(1,1);INSERTINTOvisitor_roles(visitor_id,roles_id)VALUES(2,2);安全应用实例2.创建项目创建SpringBoot项目,项目名为mystore,在出现的向导界面“Dependencies”列表中勾选SpringBoot基本框架(“Web”→“SpringWeb”)、Thymeleaf引擎组件(“TemplateEngines”→“Thymeleaf”)、Lombok模型简化组件(“DeveloperTools”→“Lombok”)、JPA框架(“SQL”→“SpringDataJPA”)以及MySQL的驱动(“SQL”→“MySQLDriver”)。为使项目支持安全访问,最重要的是添加SpringSecurity安全框架,勾选“Security”→“SpringSecurity”,如图6.2所示。安全应用实例添加的SpringSecurity安全框架在项目pom.xml文件中对应有两个依赖项,如下:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><dependency><groupId>org.thymeleaf.extras</groupId><artifactId>thymeleaf-extras-springsecurity5</artifactId></dependency>安全应用实例3.配置连接打开项目工程目录树src→main→resources下的perties文件,在其中配置对MySQL数据库的连接,内容如下:spring.datasource.url=jdbc:mysql://localhost:3306/netshop?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=truespring.datasource.username=rootspring.datasource.password=123456spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver4.开发实体在项目工程目录树的com.example.mystore节点下创建entity包,其中创建访客和角色两个关联的实体类。(1)访客实体访客实体对应的是访客表(visitor),设计实体类Visitor.java,代码显示。安全应用实例(2)角色实体角色实体对应的是角色表(role),其实体类Role.java的代码如下:packagecom.example.mystore.entity;
importlombok.Data;
importjavax.persistence.Entity;importjavax.persistence.Id;
@Entity@DatapublicclassRole{ @Id privateintid; //角色号 privateStringname; //角色名}安全应用实例5.开发持久层持久层就只有一个JPA数据接口,用于获取数据库中的访客用户数据。在项目工程目录树的com.example.mystore节点下创建repository包,其中创建接口VisitorRepository.java,定义代码为:packagecom.example.mystore.repository;
importcom.example.mystore.entity.Visitor;importorg.springframework.data.jpa.repository.JpaRepository;
publicinterfaceVisitorRepositoryextendsJpaRepository<Visitor,Integer>{ VisitorfindByUsername(Stringusername); //根据用户名查询访客}安全应用实例6.定义安全服务类在项目工程目录树的com.example.mystore节点下创建service包,其中定义安全服务类。(1)实现UserDetailsService接口定义的安全服务类只要重写接口中的loadUserByUsername方法。安全服务类MyUserDetailsService.java代码显示。(2)自定义加密器前面已经讲过,SpringSecurity5默认采用BCrypt算法的加密器,但本例为简单起见,存储在MySQL中的用户密码用的都是明文,为免去加(解)密的麻烦,这里自定义了一个加密器,它不使用任何加密算法,直接将明文字符串原样返回。安全应用实例自定义加密器MyPasswordEncoder.java的代码为:packagecom.example.mystore.service;
importorg.springframework.security.crypto.password.PasswordEncoder;
publicclassMyPasswordEncoderimplementsPasswordEncoder{ @Override publicStringencode(CharSequencesequence){ returnsequence.toString(); //直接将明文字符串原样返回 }
@Override publicbooleanmatches(CharSequencesequence,Stringpassword){ returnpassword.equals(sequence.toString()); //直接明文匹配 }}安全应用实例7.配置安全策略对安全策略的设计都在一个Java配置类中进行,如前面所介绍的,也就是重写安全框架适配器中的两个configure方法。在项目工程目录树的com.example.mystore节点下创建configer包,其中创建配置类SecurityConfiger,继承安全框架适配器WebSecurityConfigurerAdapter类。SecurityConfiger.java代码显示。说明:(a)builder.userDetailsService(getUserDetailsService()).passwordEncoder(getPasswordEncoder());:在第1个configure方法中配置认证策略,通过AuthenticationManagerBuilder向安全框架中注入前面自定义的安全服务类及加密器。(b)http.authorizeRequests().anyRequest().authenticated().and().formLogin().loginPage("/index").failureUrl("/
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中级财务会计知到课后答案智慧树章节测试答案2025年春北方工业大学
- 张家口学院《医学遗传学研究进展》2023-2024学年第二学期期末试卷
- 广西生态工程职业技术学院《普通生物学》2023-2024学年第二学期期末试卷
- 苏州城市学院《乐理与视唱》2023-2024学年第一学期期末试卷
- 柳州城市职业学院《大学英语Ⅰ(5)》2023-2024学年第一学期期末试卷
- 河北2025年五下数学期末学业水平测试模拟试题含答案
- 昌吉职业技术学院《英语高级阅读》2023-2024学年第一学期期末试卷
- 天津财经大学《厨房管理》2023-2024学年第二学期期末试卷
- 长江师范学院《土木工程材料(一)》2023-2024学年第二学期期末试卷
- 公共交通停车场管理制度
- 2023水利工程质量检测规程
- 2024年安全员考试题库有答案
- pp纤维滤布生产工艺
- 《小升初家长会》课件
- 制药无菌灌装操作规程
- (完整版)年产30万吨甲醇工艺设计毕业设计
- 农田春耕安全生产培训
- 2023工程量增加补充协议正规版
- DN1000供水管抢修施工方案
- A4纸笔记本横格线条打印模板
- 【大班户外体育游戏活动的问题及对策研究S幼儿园为例7000字(论文)】
评论
0/150
提交评论