SpringBoot使用Spring Security實(shí)現(xiàn)登錄注銷功能
1.首先看下我的項(xiàng)目結(jié)構(gòu)

我們逐個(gè)講解
/**
* 用戶登錄配置類
* @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();
}
//賬號(hào)
@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類是配置用戶登錄成功后,來(lái)存儲(chǔ)用戶登錄的信息
/**
* 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是根據(jù)查找用戶名的,需要實(shí)現(xiàn)UserDetailsService接口的loadUserByUsername的方法也就是會(huì)找用戶名,這個(gè)根據(jù)mapper層,也就是數(shù)據(jù)庫(kù)查找,返回只也就是剛才配置的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配置用戶密碼加密的,這里的加密可以按照自己業(yè)務(wù)需求來(lái)使用加密,按照這樣換一種加密類型就可以了。
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 {
//循環(huán)獲取用戶不需要驗(yàn)證url(這里是記錄在yml)
List<String> clientNoLoginUrls = new ArrayList<String>();
if (!noLoginUrls.isEmpty()) {
for (String s : noLoginUrls.split(",")) {
clientNoLoginUrls.add(adminUrlContext + s);
}
}
http.
//需要驗(yàn)證登錄的url
antMatcher(adminUrlContext + "/**").authorizeRequests()
//不需登錄驗(yàn)證的url
.antMatchers(clientNoLoginUrls.toArray(new String[0])).permitAll()
.anyRequest().authenticated().and()
//開啟表單驗(yàn)證
.formLogin().
//驗(yàn)證登錄的url
loginProcessingUrl("/houtai/login")
//登錄的頁(yè)面
.loginPage("/houtai/login")
//登錄成功后跳轉(zhuǎn)
.defaultSuccessUrl("/houtai").permitAll().and()
//注銷登錄的url
.logout().logoutUrl("/houtai/loginout")
//注銷之后跳轉(zhuǎn)的頁(yè)面
.logoutSuccessUrl("/houtai")
.and().rememberMe().and().csrf().disable();;
}
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
//需要哪個(gè)service,和驗(yàn)證密碼的方式,剛才我們都配置了
auth.userDetailsService(adminCustomerDetailsService).passwordEncoder(new YhPasswordEncoder());
}
}
最后就是配置首先開啟
@Configuration
@EnableWebSecurity
的注解

一個(gè)是我們剛才配置的service
其他兩個(gè)兩個(gè)變量是在配置文件配置的

最后配置我們表單驗(yàn)證就可以了input的name必須是username和password,除非重新配置了,
action="/houtai/login"就是直接這樣就可以實(shí)現(xiàn)登錄了

如果有HttpSecurity配置的細(xì)節(jié)問題可以提問
補(bǔ)充可以自己配置登錄成功和失敗類

到此這篇關(guān)于SpringBoot使用Spring Security實(shí)現(xiàn)登錄注銷功能的文章就介紹到這了,更多相關(guān)Spring Security登錄注銷內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 詳解springboot?springsecuroty中的注銷和權(quán)限控制問題
- SpringBoot--- SpringSecurity進(jìn)行注銷權(quán)限控制的配置方法
- Vue+springboot批量刪除功能實(shí)現(xiàn)代碼
- springboot和vue前后端交互的實(shí)現(xiàn)示例
- SpringBoot3結(jié)合Vue3實(shí)現(xiàn)用戶登錄功能
- 基于SpringBoot和Vue3的博客平臺(tái)的用戶注冊(cè)與登錄功能實(shí)現(xiàn)
- SpringBoot和Vue.js實(shí)現(xiàn)的前后端分離的用戶權(quán)限管理系統(tǒng)
- 詳解SpringBoot項(xiàng)目整合Vue做一個(gè)完整的用戶注冊(cè)功能
- Vue結(jié)合Springboot實(shí)現(xiàn)用戶列表單頁(yè)面(前后端分離)
- vue+springboot用戶注銷功能實(shí)現(xiàn)代碼
相關(guān)文章
Java中Hashtable類與HashMap類的區(qū)別詳解
Hashtable的應(yīng)用非常廣泛,HashMap是新框架中用來(lái)代替Hashtable的類,也就是說(shuō)建議使用HashMap,不要使用Hashtable。可能你覺得Hashtable很好用,為什么不用呢?這里簡(jiǎn)單分析他們的區(qū)別。2016-01-01
自主配置數(shù)據(jù)源,mybatis/plus不打印sql日志問題
這篇文章主要介紹了自主配置數(shù)據(jù)源,mybatis/plus不打印sql日志問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
Java?RabbitMQ的持久化和發(fā)布確認(rèn)詳解
這篇文章主要為大家詳細(xì)介紹了RabbitMQ的持久化和發(fā)布確認(rèn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03
SpringBoot?AOP統(tǒng)一處理Web請(qǐng)求日志的示例代碼
springboot有很多方法處理日志,例如攔截器,aop切面,service中代碼記錄等,下面這篇文章主要給大家介紹了關(guān)于SpringBoot?AOP統(tǒng)一處理Web請(qǐng)求日志的相關(guān)資料,需要的朋友可以參考下2023-02-02
Shiro與Springboot整合開發(fā)的基本步驟過程詳解
這篇文章主要介紹了Shiro與Springboot整合開發(fā)的基本步驟,本文結(jié)合實(shí)例代碼給大家介紹整合過程,感興趣的朋友跟隨小編一起看看吧2023-06-06
淺談一下RabbitMQ、Kafka和RocketMQ消息中間件對(duì)比
這篇文章主要介紹了淺談一下RabbitMQ、Kafka和RocketMQ消息中間件對(duì)比,消息中間件屬于分布式系統(tǒng)中一個(gè)字系統(tǒng),關(guān)注于數(shù)據(jù)的發(fā)送和接收,利用高效可靠的異步信息傳遞機(jī)制對(duì)分布式系統(tǒng)中的其余各個(gè)子系統(tǒng)進(jìn)行集成,需要的朋友可以參考下2023-05-05

