今天小編使用到了SpringBoot+SpringSecurity進(jìn)行公司項(xiàng)目開(kāi)發(fā),之前使用到項(xiàng)目都是采用xml配置來(lái)整合SpringSecurity,對(duì)于第一次使用SpringBoot整合SpringSecurity也是比較陌生,過(guò)程中也是遇到各種各樣的問(wèn)題,在CSDN的知識(shí)海洋中遺留的相關(guān)的整合教程也是五花八門,找一篇完整的教程簡(jiǎn)直像是大海撈針,so,小編決定親自揮筆,整頓這種低質(zhì)量博文
首先、我們創(chuàng)建一個(gè)SpringBoot項(xiàng)目工程,SpringBoot項(xiàng)目工程的搭建,小編這里就不做演示,比較簡(jiǎn)單 ,目前已經(jīng)搭建并成功啟動(dòng)
接下來(lái)、對(duì)于SpringBoot整合SpringSecurity最重要的一步,毫無(wú)疑問(wèn)必然是SpringSecurity依賴導(dǎo)入,這里導(dǎo)入的是spring-boot-starter-security依賴
<!--springSecurity-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
?依賴已經(jīng)成功導(dǎo)入,此時(shí)你訪問(wèn)SpringBoot項(xiàng)目地址:http://localhost:8080/,你將會(huì)跳轉(zhuǎn)到SpringSecurity默認(rèn)的登錄頁(yè)面,由于小編這里只是講解操作,所以就沒(méi)有設(shè)置自定義的登陸頁(yè)面,默認(rèn)登陸頁(yè)面如下:
?SpringSecurity其實(shí)設(shè)置的有默認(rèn)的登錄賬號(hào)和密碼,默認(rèn)的賬號(hào)是user,默認(rèn)的登錄密碼在SpringBoot項(xiàng)目啟動(dòng)的時(shí)候會(huì)自動(dòng)生成,圖中紅框部分就是SpringSecurity生成的初始密碼,大家可以自行測(cè)試登陸
?接下來(lái)的知識(shí)和操作就比較重要了,大家一定要收藏、關(guān)注加點(diǎn)贊,拿出自己的小本本記錄下來(lái),下面即將講述SpringSecurity相關(guān)的配置操作
首先,建立一個(gè)config文件包,用來(lái)存儲(chǔ)相關(guān)的SpringSecurity的配置文件類
第二、新建一個(gè)SpringSecurity的配置類SecurityConfig,繼承于WebSecurityConfigurerAdapter,代碼塊如圖所示,大家可以直接復(fù)制,下面會(huì)對(duì)其中存疑的代碼進(jìn)行解釋
package com.geli.config;
import com.geli.service.impl.LoginUserDetailsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private LoginUserDetailsService loginUserDetailsService;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(loginUserDetailsService)// 設(shè)置自定義的userDetailsService
.passwordEncoder(passwordEncoder());
}
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/css/**","/fonts/**","/images/**","/js/**");
}
@Bean
public PasswordEncoder passwordEncoder(){
// 使用BCrypt加密密碼
return new BCryptPasswordEncoder();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.headers().frameOptions().disable();//開(kāi)啟運(yùn)行iframe嵌套頁(yè)面
http//1、配置權(quán)限認(rèn)證
.authorizeRequests()
//配置不攔截路由
.antMatchers("/500").permitAll()
.antMatchers("/403").permitAll()
.antMatchers("/404").permitAll()
.antMatchers("/goLogin.do").permitAll()
.antMatchers("/login.do").permitAll()
.anyRequest() //任何其它請(qǐng)求
.authenticated() //都需要身份認(rèn)證
.and()
//2、登錄配置表單認(rèn)證方式
.formLogin()
.loginPage("/goLogin.do")//自定義登錄頁(yè)面的url
.usernameParameter("username")//設(shè)置登錄賬號(hào)參數(shù),與表單參數(shù)一致
.passwordParameter("password")//設(shè)置登錄密碼參數(shù),與表單參數(shù)一致
// 告訴Spring Security在發(fā)送指定路徑時(shí)處理提交的憑證,默認(rèn)情況下,將用戶重定向回用戶來(lái)自的頁(yè)面。登錄表單form中action的地址,也就是處理認(rèn)證請(qǐng)求的路徑,
// 只要保持表單中action和HttpSecurity里配置的loginProcessingUrl一致就可以了,也不用自己去處理,它不會(huì)將請(qǐng)求傳遞給Spring MVC和您的控制器,所以我們就不需要自己再去寫一個(gè)/user/login的控制器接口了
.loginProcessingUrl("/login.do")//配置默認(rèn)登錄入口
.defaultSuccessUrl("/goIndex.do")//登錄成功后默認(rèn)的跳轉(zhuǎn)頁(yè)面路徑
.failureUrl("/goLogin.do?error=true")
.and()
//3、注銷
.logout()
.logoutUrl("/logout.do")
.permitAll()
.and()
//4、session管理
.sessionManagement()
.invalidSessionUrl("/login.html") //失效后跳轉(zhuǎn)到登陸頁(yè)面
//單用戶登錄,如果有一個(gè)登錄了,同一個(gè)用戶在其他地方登錄將前一個(gè)剔除下線
//.maximumSessions(1).expiredSessionStrategy(expiredSessionStrategy())
//單用戶登錄,如果有一個(gè)登錄了,同一個(gè)用戶在其他地方不能登錄
//.maximumSessions(1).maxSessionsPreventsLogin(true) ;
.and()
//5、禁用跨站csrf攻擊防御
.csrf()
.disable();
}
}
1、對(duì)于注入的loginUserDetailsService對(duì)象,馬上就會(huì)講到,后面會(huì)創(chuàng)建,大家不用著急
2、第二部分代碼是認(rèn)證管理器的,大家自行復(fù)制就行
?3、第三部分是用來(lái)放行靜態(tài)資源文件的,SpringSecurity會(huì)默認(rèn)攔截靜態(tài)資源文件
4、第四部分代碼是用來(lái)設(shè)置加密方式的
?5、最后一部分是用來(lái)設(shè)置權(quán)限認(rèn)證配置
第三、新建上面缺少的LoginUserDetailsService類,該類需要添加@Service注解,所以小編放置在service包下面在,該類實(shí)現(xiàn)UserDetailsService接口,其中注入的是查詢數(shù)據(jù)庫(kù)的UserService,沒(méi)有注入dao,只是為了方便測(cè)試,打開(kāi)根據(jù)自己需要進(jìn)行修改就是,目的只是為了查詢數(shù)據(jù)庫(kù)數(shù)據(jù)
package com.geli.service.impl;
import com.geli.domain.Permission;
import com.geli.domain.User;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
@Service
public class LoginUserDetailsService implements UserDetailsService {
@Resource
private UserServiceImpl userService;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userService.findUserByUserName(username);
if (user == null){
throw new UsernameNotFoundException("not found");
}
//定義權(quán)限列表.
List<GrantedAuthority> authorities = new ArrayList<>();
// 用戶可以訪問(wèn)的資源名稱(或者說(shuō)用戶所擁有的權(quán)限) 注意:必須"ROLE_"開(kāi)頭
if (user.getRole()!=null){
authorities.add(new SimpleGrantedAuthority(user.getRole().getKeyWord()));
if (user.getRole().getPermissionList() !=null && user.getRole().getPermissionList().size()>0){
for (Permission permission : user.getRole().getPermissionList()) {
authorities.add(new SimpleGrantedAuthority(permission.getKeyWord()));
}
}
}
org.springframework.security.core.userdetails.User user1 = new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), authorities);
return user1;
}
}
其中比較重要的就是添加用戶角色和權(quán)限的部分,大家根據(jù)自己的實(shí)際需求進(jìn)行修改就可以?,就是圖中這部分代碼
?第四,小編這里貼一下自己的實(shí)體類代碼,大家可以方便理解
用戶實(shí)體類
package com.geli.domain;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
@NoArgsConstructor
@AllArgsConstructor
@Data
public class User implements Serializable {
private Integer id; //用戶id
private String username; //用戶賬號(hào)
private String password; //用戶密碼
private String addUser; //添加用戶人員賬號(hào)
private String editUser; //編輯用戶人員賬號(hào)
private Date addDate; //添加賬號(hào)時(shí)間
private Date updateDate; //更新賬號(hào)時(shí)間
private Role role; //用戶角色
}
角色實(shí)體類
package com.geli.domain;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Set;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Role implements Serializable {
private Integer id; //角色id
private String name; //角色名稱
private String keyWord; //角色關(guān)鍵字
private String description; //角色描述
private Set<Permission> permissionList; //用戶權(quán)限集合
}
權(quán)限實(shí)體類
package com.geli.domain;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Permission implements Serializable {
private Integer id; //權(quán)限id
private String name; //權(quán)限名稱
private String keyWord; //權(quán)限關(guān)鍵字
private String description; //權(quán)限描述
}
第四、就下來(lái)就是測(cè)試SpringSecurity,小編在UserServiceImpl里面添加了一個(gè)用戶賬號(hào),代碼如圖所示:
import com.geli.service.UserService;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
@Override
public User findUserByUserName(String username) {
User user = new User();
user.setId(1);
user.setUsername("D46033");
user.setPassword("$2a$10$Pgs46f8LzTjOvA5Sg6qDkOBbUoAtWQQdHFoEbbmWPak.34/NwJQrW");
return user;
}
}
進(jìn)入登陸頁(yè)面?
?登陸成功之后自動(dòng)跳轉(zhuǎn)到自定義的index頁(yè)面文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-617879.html
?以上就是SpringBoot整合SpringSecurity的所有內(nèi)容,中間測(cè)試過(guò)程中缺少了相關(guān)配置,與SpringSecurity無(wú)關(guān),小編就不進(jìn)行展示了,一篇小小的文章耗費(fèi)的是作者眾多實(shí)驗(yàn)的心血,希望大家多多支持,一鍵三連!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-617879.html
到了這里,關(guān)于SpringBoot整合SpringSecurity詳細(xì)教程(實(shí)戰(zhàn)開(kāi)發(fā)講解)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!