SpringBoot 安全管理(一)
SpringBoot 安全管理(一)
一、springSecurity入门
添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId></dependency>不做配置时,每次访问都需要验证,用户名默认为user,密码为启动时控制台打印的密文(每次启动都会随机生成),访问/logout即可注销登录
- 如 Using generated security password: 31612171-4f6a-4c43-92ae-6826bc1d5e49
- 注意,登录如果404,是因为没有配置页面,登录成功后默认跳转到 “/ ” 下面,没有页面,便404了
手动配置(数据是写死的)
在spring5以后,security是不允许明文的,必须加密
在application.properties中配置
spring.security.user.name=user
spring.security.user.password=123
spring.security.user.roles=admin在类中配置(注意继承了WebSecurityConfigurerAdapter,加上Configuration注解)
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter { @Bean
PasswordEncoder passwordEncoder(){
//这个已过期,作用是无需加密,允许明文
return NoOpPasswordEncoder.getInstance();
} @Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user").password("123").roles("admin")
.and() //可重复添加
.withUser("user1").password("123").roles("super");
}
}
HttpSecurity(登陆注销相关的配置,有点长,请耐心观看)
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests() //开启登录配置
.antMatchers("admin/**").hasRole("admin") // 访问/admin下需要admin角色
.antMatchers("user/**").hasAnyRole("admin","user") //访问/user下需要admin或user其中一个角色
.anyRequest().authenticated() //除以上2个url 访问其他只需要登录
.and()
.formLogin()
.loginProcessingUrl("/login") //配置登录接口
.usernameParameter("uname") //定义用户名的key
.passwordParameter("passwd") //定义密码的key
//.successForwardUrl("xxxxx") 定义登录成功后跳转的页面(前后端不分离) .successHandler(new AuthenticationSuccessHandler() {
@Override //定义成功后返回json数据 ,前后端分离
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
response.setContentType("application/json;charset=utf-8");
PrintWriter writer = response.getWriter();
Map<String,Object> map = new HashMap<>();
map.put("status",200);
map.put("msg","success");
writer.write(new ObjectMapper().writeValueAsString(map)); //将map以json格式输出
writer.flush();
writer.close();
}
}) .failureHandler(new AuthenticationFailureHandler() {
@Override //定义失败后的操作(前后端分离)
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) throws IOException, ServletException {
response.setContentType("application/json;charset=utf-8");
PrintWriter writer = response.getWriter();
Map<String,Object> map = new HashMap<>();
map.put("status",401);
if (e instanceof LockedException){
map.put("msg","账户被锁定,登陆失败");
}//在lockerException的父类的父类中就有很多异常,如下图,灵活使用
writer.write(new ObjectMapper().writeValueAsString(map)); //将map以json格式输出
writer.flush();
writer.close();
}
})
.permitAll() //登录接口对所有人开放
.and() .logout()
.logoutUrl("/logout")
.logoutSuccessHandler(new LogoutSuccessHandler() {
@Override //注销登录
public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
response.setContentType("application/json;charset=utf-8");
PrintWriter writer = response.getWriter();
Map<String,Object> map = new HashMap<>();
map.put("status",200);
map.put("msg","注销成功");
writer.write(new ObjectMapper().writeValueAsString(map)); //将map以json格式输出
writer.flush();
writer.close();
}
})
.permitAll();
}
多个HttpSecurity配置(使代码看起来更简洁)
@Configuration
public class Config2 {@Bean
PasswordEncoder passwordEncoder(){
return NoOpPasswordEncoder.getInstance();
} @Autowired
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user").password("123").roles("admin")
.and()
.withUser("user1").password("123").roles("super");
} @Configuration
@Order(1) //优先级 ,数字越小,级别越高
public static class AdminSecurityConfig extends WebSecurityConfigurerAdapter(){
//参考SecurityConfig的配置
} @Configuration
public static class UserSecurityConfig extends WebSecurityConfigurerAdapter(){
//参考SecurityConfig的配置
}
}
密码加密
@Bean
PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
SpringSecurity使用的密码加密比MD5+盐更加严谨,即使相同的明文,加密的密文也一样,不易被暴力破解,而且不用解决存盐问题,当然,世界上没有绝对的安全加密,只能说更加安全。
如果有对你帮助,求点个赞。
SpringBoot 安全管理(一)的更多相关文章
- SpringBoot安全管理--(三)整合shiro
简介: Apache Shiro 是一一个开源的轻量级的Java安全框架,它提供身份验证.授权.密码管理以及会话管理等功能. 相对于Spring Security, Shiro框架更加直观.易用,同时 ...
- SpringBoot安全管理--(二)基于数据库的认证
简介: 上篇文章向读者介绍的认证数据都是定义在内存中的,在真实项目中,用户的基本信息以及角色等都存储在数据库中,因此需要从数据库中获取数据进行认证. 开始: 首先建表并且插入数据: pom.xml & ...
- SpringBoot安全管理--(一)SpringSecurity基本配置
简介: Spring Boot针对Spring Security提供了自动化配置方案,因此可以使Spring Security非常容易地整合进Spring Boot项目中,这也是在Spring Boo ...
- 2流高手速成记(之五):Springboot整合Shiro实现安全管理
废话不多说,咱们直接接上回 上一篇我们讲了如何使用Springboot框架整合Nosql,并于文章最后部分引入了服务端Session的概念 而早在上上一篇中,我们则已经讲到了如何使用Springboo ...
- Shiro 核心功能案例讲解 基于SpringBoot 有源码
Shiro 核心功能案例讲解 基于SpringBoot 有源码 从实战中学习Shiro的用法.本章使用SpringBoot快速搭建项目.整合SiteMesh框架布局页面.整合Shiro框架实现用身份认 ...
- 【原】无脑操作:IDEA + maven + Shiro + SpringBoot + JPA + Thymeleaf实现基础授权权限
上一篇<[原]无脑操作:IDEA + maven + Shiro + SpringBoot + JPA + Thymeleaf实现基础认证权限>介绍了实现Shiro的基础认证.本篇谈谈实现 ...
- 【原】无脑操作:IDEA + maven + Shiro + SpringBoot + JPA + Thymeleaf实现基础认证权限
开发环境搭建参见<[原]无脑操作:IDEA + maven + SpringBoot + JPA + Thymeleaf实现CRUD及分页> 需求: ① 除了登录页面,在地址栏直接访问其他 ...
- springboot 注册dao层 service 层
可以使用三种注解来引入DAO层的接口到spring容器中.1.@Mapper,写在每一个DAO层接口上,如下: 2.@MapperScan和@ComponentScan两者之一.前者的意义是将指定包中 ...
- 补习系列(6)- springboot 整合 shiro 一指禅
目标 了解ApacheShiro是什么,能做什么: 通过QuickStart 代码领会 Shiro的关键概念: 能基于SpringBoot 整合Shiro 实现URL安全访问: 掌握基于注解的方法,以 ...
随机推荐
- [UWP]推荐一款很Fluent Design的bilibili UWP客户端 : 哔哩
UWP已经有好几个Bilibili的客户端,最近有多了一个: 哔哩 - Microsoft Store 作者云之幻是一位很擅长设计的UWP开发者,我也从他那里学到了很多设计方面的技巧.它还是一位Bil ...
- 学习vue第五节,vue中使用class和style的css样式
vue中使用class样式 数组 <h1 :class="['red', 'thin']">这是一个H1</h1> 数组中使用三元表达式 <h1 :c ...
- mac下使用xampp中php显示1044/1045/1046(卸载xampp)
问题描述 在mac下使用xampp,访问http://192.168.64.3/phpmyadmin/可以正常显示php页面,当创建数据库时提示1044也就是普通用户没有权限 问题猜测 猜测在使用xa ...
- 多表同步 ES 的问题
原始需求 对跨业务域数据提供联查搜索能力. 比如:对退款单提供根据退款单.退款状态.发货状态的联查,其中退款状态和发货状态是跨业务域. 比如:对订单提供根据订单号.订单状态.退款状态的联查,其中订单状 ...
- Redis 学习笔记(一) 字符串 SDS
SDS 简单动态字符串. SDS的结构: struct sdshdr{ int len;//记录BUF数组中已使用字节的数量 ,等于SDS所八寸字符串的长度 int free;//记录BUF数组中未使 ...
- PHP导出excel文件之权限字段筛选导出
因为导出excel时要过滤掉不是自身权限内的数据,权限有专门的字段,所以导出的数据要具体考量,数据库权限字段是MMId,因为登录的时候MMId已存入SESSION,所以导出的时候只要判断是否在此SES ...
- STM32 使用st-link调试遇到写保护 Flash Timeout 问题的解决思路
本文介绍了如何解决STM32芯片Flash写保护导致无法下载程序,无法在线调试的问题:如果您遇到相同的问题,希望本文可以带来一些帮助: 如果本文帮到了您,请帮忙点个赞
- Intel x86
PCIe一般规则: purely平台 Intel UPI, Processor DMI3 (Rx lanes only), and Processor PCIe3 (Rx lanes only)Not ...
- yum安装mysql 之后问题
日志报错: 190412 15:56:50 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create ...
- OpenCv 学习安装(一)
1.opencv版本:opencv-3.4.2-vc14_vc15.exe2.设置环境变量path: E:\opencv\opencv\build\x64\vc14\bin3.用VS2015新建一个w ...