Spring安全概述
后台分析认证授权分析
Spring安全概述
Spring Security基本架构
Spring安全快速入门
创建项目并添加项目依赖
创建配置文件
创建项目启动类
运行启动类访问测试
定义登录成功页面
设置登录密码
实现SpringSecurity认证逻辑
自定义登录逻辑自定义登录页面
登录成功处理程序和登录失败处理程序
免费静态资源
设计和实现注销
实现SpringSecurity授权逻辑
修改授权配置类,定义资源控制器。
开始服务访问测试
Spring认证授权异常处理
异常类型异常处理规范
自定义异常处理对象
配置异常处理对象
系统会话状态分析与实践
什么是会话状态?会话状态是如何存储的?
有状态会话技术分析
无状态会话技术分析
概括
重点难点分析FAQ分析
错误分析
Spring安全概述
============================================================================
背景分析
数据是公司最重要的资源。其中一些数据可以匿名直接访问,一些数据只能在登录后访问,而一些数据即使在成功登录后没有足够的权限也无法访问。大多数系统都需要这样的手段来保护数据(资源),但早期没有办法专门设计和实现这样的业务。每个系统都有自己独特的设计和实现,但后续的市场实现都是基于Spring Security 和Apache Taro 等共性。
认证授权分析
当用户访问资源时,系统必须控制用户的权限。具体流程如下图所示。
Spring安全概述
Spring Security是Spring官方推出的企业级安全框架,在SpringBoot技术发布后,其配置已经大大简化,现已上市。分布式架构下,我们正在逐步转向Spring Security。
Spring Security基本架构
当Spring Security为你的企业实现认证和授权服务时,它在底层构建了许多过滤器。
其中:
绿色部分是认证过滤器。您必须自行配置。您还可以使用Spring Security 提供的默认身份验证过滤器。黄色部分是Spring Security通过这些过滤器的身份验证过滤器。然后调用相关对象来完成认证和授权操作。
Spring安全快速入门
==============================================================================
创建一个项目
添加项目依赖
?xml 版本=\’1.0\’ 编码=\’UTF-8\’?
项目xmlns=\”http://maven.apache.org/POM/4.0.0\”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”
4.0.0
Spring Boot 启动父级
org.springframework.boot
2.3.2. 发布
商业
02-jt-spring安全
1.0-快照
maven.compiler.source8/maven.compiler.source
maven.compiler.target8/maven.compiler.target
org.springframework.boot
Spring Boot启动器网络
org.springframework.boot
Spring Boot 启动器安全性
org.springframework.boot
Spring引导启动器测试
创建配置文件
在资源目录中创建application.yml 文件并指定服务端口。
服务器:
端口: 8080
创建项目启动类
com.cy.jt 包;
导入org.springframework.boot.SpringApplication。
导入org.springframework.boot.autoconfigure.SpringBootApplication。
@SpringBootApplication
公共类SpringSecurityApplication {
公共静态无效主(字符串[] args){
SpringApplication.run(
SpringSecurityApplication.class,
争论);
}
}
运行启动类访问测试
第一步:是检查控制输出,看看是否自动生成了诸如:之类的密码。
使用生成的安全密码: 360123aa-df93-4cd9-bab4-5212af421d2c
第二步:打开浏览器并输入http://localhost:8080,这将带您进入登录页面(例如:)。
在登录窗口中输入用户名user(系统默认)和密码(服务启动时控制台默认打印的密码)。
密码),然后单击“登录”进行登录。登录成功后,默认会看到如下界面:
定义登录成功页面
在项目的resources目录下创建一个static目录,并在该目录下创建一个index.html文件,例如:
标题
Login Ok
启动服务并再次运行登录访问测试。登录成功后,系统默认跳转到index.html页面。
设置登录密码
第一步: 是创建一个方法(您可以在启动类中调用并运行该方法)来加密著名的文本。例如,
静态无效encodePwd(){
BCryptPasswordEncoder 编码器=new BCryptPasswordEncoder();
string password=\”123456\”;//纯文本
String newPwd=encoder.encode(“123456”);
System.out.println(newPwd);//$2a
十
十
10fahHJIe3SJm3KcyiPPQ2d.a2qR029gB3qKHrKanQ87u.KbtZ6Phr。
}
第二步:是在springboot项目的application.yml文件中设置用户和密码(例如:)。
弹簧:
安全:
用户:
名称:杰克
#password: 123456 #这个密码的写法太简单了
密码: ‘{bcrypt}$2a
十
十
10fahHJIe3SJm3KcyiPPQ2d.a2qR029gB3qKHrKanQ87u.KbtZ6Phr.\’\’
其中,{bcrypt}指定加密密码时使用的算法。
第三步,启动服务:再次运行登录测试。
实现SpringSecurity认证逻辑
==================================================================================
自定义登录逻辑
虽然SpringSecurity支持通过配置文件定义用户信息(账户、密码、角色等),但这种方式有明显的缺陷。这意味着系统上线后更改用户信息更加繁琐。因此,Spring Security还支持通过实现UserDetailsService接口来为用户提供认证和授权信息。申请流程如下:
步骤1:定义您的安全配置类。例子:
/**
使用@Configuration注解编写的类就是Spring配置类。配置类将是Spring。
这是项目开始时加载的第一件事,通常首先在配置类中配置第三方资源。
*/
@作品
公共类安全配置{
/**
定义SpringSecurity密码加密对象
@Bean 注释通常描述使用@Configuration 注释描述的类中的方法。
用来告诉Spring框架这个方法的返回值应该传递给Spring管理和Spring。
托管对象有默认名称。当然,你也可以传递这个名字。
@Bean注解命名
*/
@Bean //对象名默认为方法名
//@Bean(\”bcryptPasswordEncoder\”)//Bean对象名为bcryptPasswordEncoder
公共BCryptPasswordEncoderpasswordEncoder(){
返回一个新的BCryptPasswordEncoder()。
}
}
第二步:定义UserDetailService接口实现类,自定义登录逻辑代码如下:
UserDetailService是SpringSecurity官方提供的登录逻辑处理对象。自己实现这个接口,并在相应的方法中编写自己的登录逻辑。
包com.cy.jt.security.service;
@服务
公共类UserDetailServiceImpl 实现UserDetailsService {
@Autowired
私有BCryptPasswordEncoder 密码编码器;
/**
当进行登录操作时,底层通过过滤器等对象调用该方法。
@param username 该参数是页面输出的用户名。
@return通常是根据用户名从数据库查询到的用户信息。
@抛出UsernameNotFoundException
*/
@覆盖
公共用户详细信息loadUserByUsername(字符串用户名)
抛出UsernameNotFoundException {
//1.根据用户名从数据库查询用户信息。
//用户user=userMapper.selectUserByUsername(用户名);
if(!\”jack\”.equals(username))//假设这是从数据库查询到的信息
throw new UsernameNotFoundException(\”用户不存在\”);
//2.返回封装在UserDetails对象中的用户信息。
//假设这个密码是从数据库查询到的
StringencodedPwd=passwordEncoder.encode(“123456”);
//假设这个权限信息也是从数据库查询到的
//如果分配权限的方式是角色,则在写入字符串时使用“ROLE_”作为前缀。
列出受保护的权限=
AuthorityUtils.commaSeparatedStringToAuthorityList(
“ROLE_admin,ROLE_normal,获取sys:res:创建sys:res:”);
//该用户是SpringSecurity提供的UserDetails接口的实现,用于封装用户信息。
//以后你也可以根据自己的需求构建自己的UserDetails接口的实现。
用户user=new User(用户名,encodedPwd,grantedAuthorities);
返回用户。
}
}
注意,这里的User对象被传递给SpringSecurity框架,该框架提取密码信息并将其与用户输入的密码进行匹配。
第3 步:启动服务并登录以访问您的测试。
自定义登录页面
第一步:定义登录页面(直接在static目录下创建)。关键代码是:
请登录
Please sign in
用户名
密码
登入
注意:请求的URL必须是临时的“/login”,请求方式必须是post方式,请求的参数必须是用户名和密码。默认情况下,这些规则在UsernamePasswordAuthenticationFilter 中定义。
步骤2:修改安全配置类实现接口,并重写相关配置方法来设计登录。这是代码:
@作品
公共类SecurityConfig 扩展WebSecurityConfigurerAdapter {
@豆子
公共密码编码器密码编码器(){
返回一个新的BCryptPasswordEncoder()。
}
@覆盖
protected void configure(HttpSecurity http) 抛出异常{
//super.configure(http);
//未能关闭跨域攻击可能会导致错误。
http.csrf().disable();
//自定义登录表单
http.formLogin()
//设置登录页面
.loginPage(“/login.html”)
//设置登录时将访问的UserDetailService对象(对应表单中的action)。
.loginProcessingUrl(“/登录”)
//将请求的username参数设置为用户名(默认为username,但你可以自己更改,并且应该与表单同步)
.usernameParameter(\”用户名\”)
//请求的password参数为密码(默认为密码,但可以自己更改,并且要与表单同步)
.passwordParameter(\”密码\”)
//设置成功登录页面(默认为/index.html)
.defaultSuccessUrl(“/index.html”)
//登录失败后访问的页面(默认为/login.html?error)
.failureUrl(“/login.html?错误”);
//认证设计
http.authorizeRequests()
//设置要发布的咨询
.antMatchers(“/login.html”).permitAll()
//设置需要认证的请求(除上述需要释放的请求外,其他都需要认证)
.anyRequest().authenticated();
}
}
登录成功处理程序和登录失败处理程序
这是一个必看的视频!获取2024年最新全套Java开发学习资料
现在很多系统都有前后端分离的设计,登录成功就可以跳转到前端系统的地址,登录成功后就可以定义自己的处理操作。 例如:
定义登录成功处理程序。
场景1:重定向的处理器可以直接运行。
包com.cy.jt.auth.config.authentication;
公共类RedirectAuthenticationSuccessHandler 实现AuthenticationSuccessHandler {
//定义跳转的URL
私有字符串重定向URL;
公共RedirectAuthenticationSuccessHandler(字符串redirectUrl){
this.redirectUrl=重定向网址;
}
@覆盖
公共无效onAuthenticationSuccess(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,
认证)
抛出IOException、ServletException {
httpServletResponse.sendRedirect(redirectUrl);
}
}
方案2:可以直接返回JSON数据的处理器。例子:
包com.cy.jt.security.config.handler;
/** 处理登录失败
0)默认-默认
1) 认证-认证
2) 故障/故障
3) 处理程序处理器
*/
公共类DefaultAuthenticationFailureHandler 实现AuthenticationFailureHandler {
@覆盖
公共无效onAuthenticationFailure(
HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse,
AuthenticationException e) 抛出IOException、ServletException {
//1.设置响应数据编码
httpServletResponse.setCharacterEncoding(\”utf-8\”);
//2. 告诉客户端响应数据的类型以及客户端应该用来显示它的编码。
httpServletResponse.setContentType(\”application/json;charset=utf-8\”);
//3. 获取输出流对象。
PrintWriter out=httpServletResponse.getWriter();
//4. 向客户端输出JSON格式字符串。
//4.1 构造地图对象
MapString, 对象映射=new HashMap();
map.put(\”州\”,\”500\”);
map.put(“msg”,“用户名或密码错误”);
//4.2 根据jackson的ObjectMapper对象将对象转换为json格式字符串
String jsonStr=new ObjectMapper().writeValueAsString(map);
out.println(jsonStr);
出.flush();
}
}
定义登录失败处理程序。
选项1:如果登录失败,则重定向到页面。例如,
包com.cy.jt.auth.config.authentication;
公共类RedirectAuthenticationFailureSuccessHandler 实现AuthenticationFailureHandler {
私有字符串重定向URL;
公共RedirectAuthenticationFailureSuccessHandler(字符串redirectUrl){
this.redirectUrl=重定向网址;
}
@覆盖
公共无效onAuthenticationFailure(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,AuthenticationException e)抛出IOException,ServletException {
httpServletResponse.sendRedirect(redirectUrl);
}
}
选项2:定义登录失败处理程序。例子:
包com.cy.jt.security.config.handler;
/** 处理登录失败
0)默认-默认
1) 认证-认证
2) 故障/故障
3) 处理程序
*/
公共类DefaultAuthenticationFailureHandler
实现AuthenticationFailureHandler {;
@覆盖
公共无效onAuthenticationFailure(
HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse,
AuthenticationException e) 抛出IOException、ServletException {
//1.设置响应数据编码
httpServletResponse.setCharacterEncoding(\”utf-8\”);
//2. 告诉客户端响应数据的类型以及客户端应该用来显示它的编码。
httpServletResponse.setContentType(\”application/json;charset=utf-8\”);
//3. 获取输出流对象。
PrintWriter 输出=httpServlet
Response.getWriter();
//4.向客户端输出一个json格式字符串
//4.1构建一个map对象
Map<String,Object> map=new HashMap<>();
map.put(“state”,“500”);
map.put(“msg”,“username or password error”);
//4.2基于jackson中的ObjectMapper对象将一个对象转换为json格式字符串
String jsonStr= new ObjectMapper().writeValueAsString(map);
out.println(jsonStr);
out.flush();
}
}
修改配置类,设置登陆成功与失败处理器。
@Configuration
public class SecutiryConfig extends WebSecurityConfigurerAdapter {
@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
//super.configure(http);
//关闭跨域攻击,不关闭容易出错
http.csrf().disable();
//自定义登陆表单
http.formLogin()
//设置登陆页面
.loginPage(“/login.html”)
//设置登陆请求处理地址(对应form表单中的action),登陆时会访问UserDetailService对象
.loginProcessingUrl(“/login”)
//设置请求用户名参数为username(默认就是username,可以自己修改,需要与表单同步)
.usernameParameter(“username”)
//请求请求密码参数为password(默认就是password,可以自己修改,需要与表单同步)
.passwordParameter(“password”)
//设置登陆成功跳转页面(默认为/index.html)
.successHandler(new RedirectAuthenticationSuccessHandler(“你的url”))
//登陆失败访问的页面(默认为/login.html?error)
.failureHandler(new RedirectAuthenticationFailureHandler(“你的url”))
//认证设计
http.authorizeRequests()
//设置要放行的咨询
.antMatchers(“/login.html”).permitAll()
//设置需要认证的请求(除了上面的要放行,其它都要进行认证)
.anyRequest().authenticated();
}
}
第四步:启动服务进行访问测试(分别用正确和错误的账号进行测试)。
放行静态资源
在SecurityManager配置类中的configure(HttpSecurity http)方法中我们可以通过对anMatchers方法定义要放行静态资源,例如:
.authorizeRequests() //设置请求的授权
.antMatchers( //配置下列路径的授权
“/index.html”,
“/js/*”,
“/css/*”,
“/img/**”,
“/bower_components/**”,
“/login.html”
).permitAll() //设置上述所有路径不需要登录就能访问(放行)
其中:
最后
整理的这些资料希望对Java开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。
其实面试这一块早在第一个说的25大面试专题就全都有的。以上提及的这些全部的面试+学习的各种笔记资料,我这差不多来回搞了三个多月,收集整理真的很不容易,其中还有很多自己的一些知识总结。正是因为很麻烦,所以对以上这些学习复习资料感兴趣
功跳转页面(默认为/index.html)
.successHandler(new RedirectAuthenticationSuccessHandler(“你的url”))
//登陆失败访问的页面(默认为/login.html?error)
.failureHandler(new RedirectAuthenticationFailureHandler(“你的url”))
//认证设计
http.authorizeRequests()
//设置要放行的咨询
.antMatchers(“/login.html”).permitAll()
//设置需要认证的请求(除了上面的要放行,其它都要进行认证)
.anyRequest().authenticated();
}
}
第四步:启动服务进行访问测试(分别用正确和错误的账号进行测试)。
放行静态资源
在SecurityManager配置类中的configure(HttpSecurity http)方法中我们可以通过对anMatchers方法定义要放行静态资源,例如:
.authorizeRequests() //设置请求的授权
.antMatchers( //配置下列路径的授权
“/index.html”,
“/js/*”,
“/css/*”,
“/img/**”,
“/bower_components/**”,
“/login.html”
).permitAll() //设置上述所有路径不需要登录就能访问(放行)
其中:
最后
整理的这些资料希望对Java开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。
[外链图片转存中…(img-ZW6rcz6Q-1720152455252)]
[外链图片转存中…(img-KSdM4DQv-1720152455252)]
其实面试这一块早在第一个说的25大面试专题就全都有的。以上提及的这些全部的面试+学习的各种笔记资料,我这差不多来回搞了三个多月,收集整理真的很不容易,其中还有很多自己的一些知识总结。正是因为很麻烦,所以对以上这些学习复习资料感兴趣
#以上关于02的相关内容来源网络仅供参考,相关信息请以官方公告为准!
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/93123.html