SpringBoot使用Spring Security实现登录注销功能
作者:W.G.H 发布时间:2023-01-05 13:19:54
标签:spring,boot,Security,登录,注销
1.首先看下我的项目结构
我们逐个讲解
/**
* 用户登录配置类
* @author Administrator
*
*/
public class AdminUserDateils implements UserDetails {
private static final long serialVersionUID = -1546619839676530441L;
private transient YCAdmin yCAdmin;
public AdminUserDateils() {
}
public AdminUserDateils(YCAdmin yCAdmin) {
if (yCAdmin != null) {
this.yCAdmin = yCAdmin;
}
}
public YCAdmin getyCAdmin() {
return yCAdmin;
}
public void setyCAdmin(YCAdmin yCAdmin) {
this.yCAdmin = yCAdmin;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
Collection<GrantedAuthority> authorities = new ArrayList<>();
SimpleGrantedAuthority authority = new SimpleGrantedAuthority("admin");
authorities.add(authority);
return authorities;
}
//用户名密码
@Override
public String getPassword() {
return yCAdmin.getAdminPassword();
}
//账号
@Override
public String getUsername() {
return yCAdmin.getAdminAccount();
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
}
首先以上AdminUserDateils类是配置用户登录成功后,来存储用户登录的信息
/**
* Spring-Security
* @author Administrator
*
*/
@Service
public class AdminCustomerDetailsService implements UserDetailsService{
@Autowired
private YCAdminMapper yCAdminMapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
YCAdmin ycAdmin= yCAdminMapper.selectYCAdminByAccount(username);
if(ycAdmin==null) {
throw new UsernameNotFoundException("未找到该用户!!");
}
//配置的AdminUserDateils
AdminUserDateils adminUserDateils = new AdminUserDateils(ycAdmin);
return adminUserDateils;
}
}
以上AdminCustomerDetailsService是根据查找用户名的,需要实现UserDetailsService接口的loadUserByUsername的方法也就是会找用户名,这个根据mapper层,也就是数据库查找,返回只也就是刚才配置的AdminUserDateils类
public class YhPasswordEncoder implements PasswordEncoder{
@Override
public String encode(CharSequence rawPassword) {
return Des3.encrypt(rawPassword.toString());
}
@Override
public boolean matches(CharSequence rawPassword, String encodedPassword) {
// TODO Auto-generated method stub
return encode(rawPassword).equals(encodedPassword);
}
}
以上YhPasswordEncoder 需要继承是我们PasswordEncoder配置用户密码加密的,这里的加密可以按照自己业务需求来使用加密,按照这样换一种加密类型就可以了。
public class AdminSecurityConfiguration {
@Configuration
@Order(2)
@EnableWebSecurity
public static class ClientSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private AdminCustomerDetailsService adminCustomerDetailsService;
@Value("${yunhui.admin.urlContext:/houtai}")
private String adminUrlContext;
@Value("${yunhui.admin.noLoginUrls:}")
private String noLoginUrls;
@Override
protected void configure(HttpSecurity http) throws Exception {
//循环获取用户不需要验证url(这里是记录在yml)
List<String> clientNoLoginUrls = new ArrayList<String>();
if (!noLoginUrls.isEmpty()) {
for (String s : noLoginUrls.split(",")) {
clientNoLoginUrls.add(adminUrlContext + s);
}
}
http.
//需要验证登录的url
antMatcher(adminUrlContext + "/**").authorizeRequests()
//不需登录验证的url
.antMatchers(clientNoLoginUrls.toArray(new String[0])).permitAll()
.anyRequest().authenticated().and()
//开启表单验证
.formLogin().
//验证登录的url
loginProcessingUrl("/houtai/login")
//登录的页面
.loginPage("/houtai/login")
//登录成功后跳转
.defaultSuccessUrl("/houtai").permitAll().and()
//注销登录的url
.logout().logoutUrl("/houtai/loginout")
//注销之后跳转的页面
.logoutSuccessUrl("/houtai")
.and().rememberMe().and().csrf().disable();;
}
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
//需要哪个service,和验证密码的方式,刚才我们都配置了
auth.userDetailsService(adminCustomerDetailsService).passwordEncoder(new YhPasswordEncoder());
}
}
最后就是配置首先开启
@Configuration
@EnableWebSecurity
的注解
一个是我们刚才配置的service
其他两个两个变量是在配置文件配置的
最后配置我们表单验证就可以了input的name必须是username和password,除非重新配置了,
action="/houtai/login"就是直接这样就可以实现登录了
如果有HttpSecurity配置的细节问题可以提问
补充可以自己配置登录成功和失败类
来源:https://blog.csdn.net/hunwgh/article/details/108725367
0
投稿
猜你喜欢
- Cookie和Session都是为了保持用户的访问状态,一方面为了方便业务实现,另一方面为了简化服务端的程序设计,提高访问性能。Cookie
- 概述使用this()或target()可绑定被代理对象实例,在通过类实例名绑定对象时,还依然具有原来连接点匹配的功能,只不过类名是通过增强方
- Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建
- instanceof关键字的使用1. 语法格式x instanceof A:检验x是否为类A的对象,返回值为boolean类型,如果是,返回
- FileOutPutStream:子类,写出数据的通道步骤:1.获取目标文件2.创建通道(如果原来没有目标文件,则会自动创建一个)3.写入数
- 很多时候,我们需要使用C#中的WebClient 来收发数据,WebClient 类提供向 URI 标识的任何本地、Intranet 或 I
- Spring boot + Spring data jpa + Thymeleaf批量插入 + POI读取 + 文件上传pom.xml:&l
- 定义定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。解决的问题在有多种算法相似的情况下,
- 目录1、如果一个方法或变量是"private"访问级别,那么它的访问范围是:2、代码将打印?3、下面关于hibernat
- 第一篇是纯利用现有JDK提供的绘图类(ImageIO)类制作,这个过程比较复杂且需要了解ImageIO类。这一篇文章是利用Hutool工具类
- Socket异常客户端异常java.net.ConnectException: Connection refused: connect。该异
- 一、什么是IOC1)控制反转,把创建对象和对象的调用过程交给Spring 管理。2)使用IOC的目的,为了降低耦合度。二、IOC的底层原理X
- 本文实例为大家分享了unity3D实现摄像机抖动的具体代码,供大家参考,具体内容如下摄像机抖动特效 在需要的地方调用CameraShake.
- 1.查找概述查找表: 所有需要被查的数据所在的集合,我们给它一个统称叫查找表。查找表(Search Table)是由同一类型的数据元素(或记
- Android自带的跑马灯效果不太好控制,还必须要满足条件才能有效果,而且速度不受控制。前面我的博客中有一篇就是用Android自带的跑马灯
- 一、使用@Profile1.1、@Profile修饰类开发环境package com.example.demo.config;import
- 任何一个类都是Class类的实例对象,这个实例对象有三种表示方式第一种表示方式(任何一个类都有一个隐含的静态成员变量class):Class
- 我们有时用C#需要实现锁住文件的功能,该如何锁住文件呢?下面小编给大家介绍一下。首先大家需要到码云里面找到如下图所示的文件锁的项目,如下图所
- 下面通过一段内容有文字说明有代码分析,并附有展示图供大家学习。要解析HTTP报文,需要实现以下操作:读取HTTP报头提供的各种属性分析属性值
- 软件需求VS2019社区版、win10操作系统、opencv4.1.0VS2019社区版(免费) 下载地址OpenCV4.1.0 下载地址配