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


猜你喜欢
- 一、环形链表1、创建结点环形链表其实也很好理解,就是将单链表的头和尾连接起来,就形成了环形链表。public class Node { &n
- 背景今天我们来谈一下我们自定义的一组WPF控件Form和FormItem,然后看一下如何自定义一组完整地组合WPF控件,在我们很多界面显示的
- 这篇文章主要介绍了Spring MVC4.1服务器端推送实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习
- 本文实例讲述了Android开发之OpenGL绘制2D图形的方法。分享给大家供大家参考,具体如下:Android为OpenGL ES支持提供
- 问题,打一个页面cpu暴涨,打开一次就涨100%,一会系统就卡的不行了。排查方法,因为是线上的linux,没有用jvm监控工具rim链接上去
- 上篇文章已经对Synchronized关键字做了初步的介绍,从字节码层面介绍了Synchronized关键字,最终字节码层面就是monito
- 在使用AndroidNDK开发的时候有个事情是很烦人的,那就是创建本地代码文件夹,生成本地代码文件和创建本地代码的编译文件。特别是实现本地方
- 今天看到一个银行的APP上面的loadingview 挺好的,就尝试着自己实现,觉得很简单,但自己实现起来还是发现了一些问题。Loading
- Java程序设计 图形用户界面 【九】单选按钮单选按钮 JRadioButtonJRadioButton类方法作用public JRadio
- 一,内部类访问成员1,内部类可以直接访问外部类的成员,包括私有。2,外部类要访问内部类,必须建立内部类对象。class Outer{int
- mybatis-plus-generator + clickhouse 自动生成代码依赖<!--> mybatis-plus &
- 本文实例讲述了C#利用System.Uri转URL为绝对地址的方法。分享给大家供大家参考。具体分析如下:在使用ASPOSE.Word生成Wo
- 在 Windows 有一些字符是不能作为文件名,尝试重命名一个文件,输入/ 就可以看到windows 提示的不能作为文件名的字符那么具体是包
- 相信有些同学跟我一样,曾经对这个问题很疑惑。在网上也看了一些别人说的观点,评论不一。有说有值传递和引用传递两种,也有说只有值传递的,这里只说
- 手头项目需要抓取一个用js渲染出来的网站中的数据。使用常用的httpclient抓回来的页面是没有数据。上网百度了一下,大家推荐的方案是使用
- 1.Mybatis概述 MyBatis 是一款
- 在使用多线程的时候有时候我们会使用 java.util.concurrent.Executors的线程池,当多个线程异步执行的时候,我们往往
- 本文实例为大家分享了Java Swing实现扫雷源码的具体代码,供大家参考,具体内容如下先来看下效果运行时只需要创建一个GameWindow
- 有时候,我们在同一个activity里面有很多fragment,在横竖屏的时候,有些fragment要求重新加载数据,有些不需要,如何简单控
- 当app中打开了多个activity的时候,由于进入的比较深,所以,很多app不得不让用户一步一步退回到第一个界面(MainActivity