日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

Spring Boot实践 | 利用Spring Security快速搞定权限控制

發(fā)布時(shí)間:2024/3/13 javascript 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Boot实践 | 利用Spring Security快速搞定权限控制 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

開(kāi)始之前

快速開(kāi)始

使用內(nèi)存簽名服務(wù)

使用數(shù)據(jù)庫(kù)簽名服務(wù)

使用自定義簽名服務(wù)

限制請(qǐng)求

強(qiáng)制使用HTTPS

防止跨站點(diǎn)偽造請(qǐng)求

用戶認(rèn)證功能


在java web工程中,一般使用Servlet過(guò)濾器(Filter)對(duì)于請(qǐng)求進(jìn)行攔截,然后在Filter中通過(guò)自己的驗(yàn)證邏輯來(lái)決定是否放行請(qǐng)求?;谶@一原理,常用的SpringMVC實(shí)現(xiàn)了自己的攔截器,同樣的,Spring Security也是基于這個(gè)原理,在進(jìn)入到DispatcherServlet前就可以對(duì)Spring MVC的請(qǐng)求進(jìn)行攔截,然后通過(guò)一定的驗(yàn)證(一般驗(yàn)證用戶是否有某個(gè)權(quán)限、請(qǐng)求類型、請(qǐng)求方式等),從而決定是否放行某個(gè)請(qǐng)求

開(kāi)始之前

?1、Spring Security的主要功能就是通過(guò)一定的驗(yàn)證,從而決定是否放行某個(gè)請(qǐng)求,可以實(shí)現(xiàn)用戶訪問(wèn)權(quán)限控制,HTTP和HTTPS訪問(wèn)控制、CSRF(跨站點(diǎn)請(qǐng)求偽造)訪問(wèn)控制等;

2、Spring Security的攔截會(huì)默認(rèn)先于其它過(guò)濾器之前執(zhí)行;

3、針對(duì)Spring Security,角色權(quán)限的命名強(qiáng)制都以"ROLE_"開(kāi)頭且全部大寫(xiě),比如"ROLE_USER","ROLE_ADMIN",

"ROLE_DBA",當(dāng)然,角色權(quán)限可以任意命名,甚至可以定義一個(gè)角色權(quán)限為"ROLE_HAHA","ROLE_WUDI"。其提供的方法有的會(huì)自動(dòng)給角色權(quán)限加上"ROLE_",這時(shí),就不能給角色權(quán)限加上"ROLE_",這里需要注意(后面會(huì)提供說(shuō)明)。

快速開(kāi)始

1、在Spring Boot項(xiàng)目中引入Spring Security的依賴。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId> </dependency>

2、啟動(dòng)注解

官方定義的是:web工程使用@EnableWebSecurity,非web工程可以使用@EnableGlobalAuthentication。而事實(shí)上,@EnableWebSecurity已經(jīng)標(biāo)注了@EnableGlobalAuthentication(可以點(diǎn)進(jìn)源碼查看)。

所以,只需要在啟動(dòng)類上標(biāo)注@EnableWebSecurity即可開(kāi)啟Spring Security功能。

3、啟動(dòng)Spring Boot項(xiàng)目

啟動(dòng)Spring Boot項(xiàng)目后,可以在Console里面看到隨機(jī)生成的秘鑰,如下。

隨即在瀏覽器中任意輸入一個(gè)存在于Spring Boot項(xiàng)目中的url,就會(huì)出現(xiàn)一個(gè)攔截頁(yè)面,輸入剛剛生成的秘鑰即可訪問(wèn)到預(yù)期的頁(yè)面,如下。

4、短板

上述過(guò)程暴露了一下問(wèn)題:

-每次啟動(dòng)都會(huì)生成不同的秘鑰,造成在訪問(wèn)的過(guò)程每次都要輸入不同的秘鑰,如果丟失又要重啟,實(shí)在是不方便;

-用戶只能使用‘user’賬號(hào),無(wú)法多樣化,不適合構(gòu)建不同的權(quán)限;

-不能自定義自己的驗(yàn)證方式和策略;

-驗(yàn)證界面不美觀;

-不能定義哪些url需要驗(yàn)證,哪些不需要;

.....................

為了克服只能使用user+自動(dòng)生成的秘鑰引起的弊端,Spring Security提供了使用內(nèi)存簽名服務(wù)、數(shù)據(jù)庫(kù)簽名服務(wù)和自定義簽名服務(wù)。

使用內(nèi)存簽名服務(wù)

顧名思義,就是將用戶信息存放在內(nèi)存中(實(shí)際項(xiàng)目都是在數(shù)據(jù)庫(kù)中)。相對(duì)而言,它比較簡(jiǎn)單,適合于快速搭建測(cè)試環(huán)境。

1、繼承WebSecurityConfigurerAdapter重寫(xiě)攔截配置

里面有三個(gè)常用方法供我們重寫(xiě),如下。

@Configuration public class RoleConfig extends WebSecurityConfigurerAdapter {/*** <p>用來(lái)配置用戶簽名服務(wù),主要是user-detail機(jī)制,還可以給與用戶賦予角色* */@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {// TODO Auto-generated method stubsuper.configure(auth);}/*** <p>用來(lái)配置Filter鏈* */@Overridepublic void configure(WebSecurity web) throws Exception {// TODO Auto-generated method stubsuper.configure(web);}/*** <p>用來(lái)配置攔截保護(hù)請(qǐng)求,比如什么請(qǐng)求放行,什么請(qǐng)求需要驗(yàn)證* */@Overrideprotected void configure(HttpSecurity http) throws Exception {// TODO Auto-generated method stubsuper.configure(http);} }

2、定義簽名服務(wù)

根據(jù)上面所述,我們只需要重寫(xiě)下面的方法即可。

/*** <p>用來(lái)配置用戶簽名服務(wù),主要是user-detail機(jī)制,還可以給與用戶賦予角色* */@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {// TODO Auto-generated method stubsuper.configure(auth);}

完整的示例

@Configuration public class RoleConfig extends WebSecurityConfigurerAdapter {/*** <p>用來(lái)配置用戶簽名服務(wù),主要是user-detail機(jī)制,還可以給與用戶賦予角色* */@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {//密碼編碼器-在Spring5的Security中都要求使用密碼編碼器,否則會(huì)發(fā)生異常BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();//使用內(nèi)存簽名服務(wù)auth.inMemoryAuthentication()//設(shè)置密碼編碼器.passwordEncoder(passwordEncoder)//注冊(cè)用戶admin,密碼為abc123,并且賦予USER和ADMIN的角色權(quán)限 .withUser("admin").password(passwordEncoder.encode("abc123")).roles("USER", "ADMIN")//連接方法and().and()//注冊(cè)用戶myuser,密碼為123456,并且賦予USER角色權(quán)限 .withUser("myuser").password(passwordEncoder.encode("123456")).roles("USER");//還需要注冊(cè)其它用戶繼續(xù)用and()連接......} }

3、重新啟動(dòng)Spring Boot項(xiàng)目

可以發(fā)現(xiàn)Console中不再為我們打印秘鑰了,隨即在瀏覽器中輸入任意一個(gè)Controller中存在的url,同樣出現(xiàn)攔截頁(yè)面,輸入我們自定義注冊(cè)的用戶即可訪問(wèn)到預(yù)期的頁(yè)面。

4、其它

user-detail機(jī)制其它構(gòu)造方法

方法描述
accountExpired(boolean accountExpired)設(shè)置賬號(hào)是否過(guò)期
accountLocked(boolean accountLocked)是否鎖定賬號(hào)
credentialsExpired(boolean credentialsExpired)定義憑證是否過(guò)期
disabled(boolean disabled)是否禁用用戶
username(String username)定義用戶名,不能為null
authorities(GrantedAuthority... authorities)賦予一個(gè)或多個(gè)權(quán)限,需要加上ROLE_
authorities(List<? extends GrantedAuthority> authorities)使用列表(List)賦予權(quán)限
password(String password)定義密碼
roles(String... roles)賦予一個(gè)或多個(gè)權(quán)限,會(huì)自動(dòng)加上ROLE_

提示:上面示例已經(jīng)演示了username()、password()和roles()構(gòu)造方法了,其它的依葫蘆畫(huà)瓢即可。?

使用數(shù)據(jù)庫(kù)簽名服務(wù)

畢竟內(nèi)存有限,且也不適合實(shí)際開(kāi)發(fā)環(huán)境。因此Spring Security提供了對(duì)數(shù)據(jù)庫(kù)的查詢方法來(lái)滿足需求。

1、創(chuàng)建數(shù)如下?lián)?并配置好數(shù)據(jù)源等其他配置

說(shuō)明:user_available字段表示用戶是否可用1-可用,0-不可用。

2、繼承WebSecurityConfigurerAdapter重寫(xiě)攔截配置,定義簽名服務(wù)

@Configuration public class RoleConfig2 extends WebSecurityConfigurerAdapter {//注入數(shù)據(jù)源@Autowiredprivate DataSource dataSource;//根據(jù)用戶名查詢用戶信息private final String getUserByUsername = "SELECT user_name as username, user_pwd as password, user_available as enabled "+ "FROM tb_user "+ "WHERE user_name = ?";//根據(jù)用戶名查詢角色信息private final String getRoleByUsername = "SELECT u.user_name as username, r.role_name as authority "+ "FROM tb_user u, tb_user_role_mid ur, tb_role r "+ "WHERE u.user_id = ur.user_id AND r.role_id = ur.role_id AND u.user_name = ?";/*** <p>用來(lái)配置用戶簽名服務(wù),主要是user-detail機(jī)制,還可以給與用戶賦予角色* */@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {//密碼編碼器-在Spring5的Security中都要求使用密碼編碼器,否則會(huì)發(fā)生異常BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();//使用數(shù)據(jù)庫(kù)簽名服務(wù)auth.jdbcAuthentication()//設(shè)置密碼編碼器.passwordEncoder(passwordEncoder)//數(shù)據(jù)源.dataSource(dataSource)//查詢用戶,自動(dòng)判斷密碼是否一致.usersByUsernameQuery(getUserByUsername)//賦予權(quán)限.authoritiesByUsernameQuery(getRoleByUsername);} }

3、重新啟動(dòng)Spring Boot項(xiàng)目

可以發(fā)現(xiàn)Console中不再為我們打印秘鑰了,隨即在瀏覽器中輸入任意一個(gè)Controller中存在的url,同樣出現(xiàn)攔截頁(yè)面,輸入我們自定義注冊(cè)的用戶即可訪問(wèn)到預(yù)期的頁(yè)面。

使用自定義簽名服務(wù)

接著使用上面的數(shù)據(jù)庫(kù)表。

1、實(shí)現(xiàn)UserDetaisService接口定義簽名服務(wù)

//這里直接標(biāo)記為@Service,作為bean掃描進(jìn)IoC,省去bean的單獨(dú)配置 @Service public class UserDetailsServiceImpl implements UserDetailsService {//普通點(diǎn)的dao層接口,獲取相應(yīng)的用戶數(shù)據(jù)和角色權(quán)限@Autowiredprivate UserMapper userMapper;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {//獲取數(shù)據(jù)庫(kù)用戶信息RoleUser user = userMapper.getUserByName(username);//獲取數(shù)據(jù)庫(kù)角色信息List<Role> roles = userMapper.listRolesByUserName(username);//將信息轉(zhuǎn)換為UserDetails對(duì)象//權(quán)限列表List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();//賦予查詢到的角色for(Role role : roles) {SimpleGrantedAuthority authority = new SimpleGrantedAuthority(role.getRoleName());authorities.add(authority);}//創(chuàng)建UserDetails對(duì)象,設(shè)置用戶名、密碼和權(quán)限 這里的編碼器要保持一致BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();UserDetails userDetails = new User(user.getUserName(), passwordEncoder.encode(user.getUserPwd()), authorities);return userDetails;} } @Configuration public class RoleConfig3 extends WebSecurityConfigurerAdapter {@Autowiredprivate UserDetailsService userDetailsService;@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {//密碼編碼器-在Spring5的Security中都要求使用密碼編碼器,否則會(huì)發(fā)生異常BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder);} }

2、重新啟動(dòng)Spring Boot項(xiàng)目

可以發(fā)現(xiàn)Console中不再為我們打印秘鑰了,隨即在瀏覽器中輸入任意一個(gè)Controller中存在的url,同樣出現(xiàn)攔截頁(yè)面,輸入我們自定義注冊(cè)的用戶即可訪問(wèn)到預(yù)期的頁(yè)面。

3、小結(jié)

可以發(fā)現(xiàn),實(shí)現(xiàn)UserDetailsService這種方式最靈活,用戶數(shù)據(jù)不僅可以來(lái)源于數(shù)據(jù)庫(kù),還可以在數(shù)據(jù)庫(kù)壓力大的情況下轉(zhuǎn)而訪問(wèn)緩存獲取用戶數(shù)據(jù)。

限制請(qǐng)求

上面只是實(shí)現(xiàn)了驗(yàn)證用戶,并且賦予了用戶某些角色權(quán)限,任何技術(shù)如果不是用于解決生產(chǎn)問(wèn)題,那就是耍流氓。

前面說(shuō)到,繼承WebSecurityConfigurerAdapter?經(jīng)常使用的三個(gè)需要重新方法是

@Configuration public class RoleConfig extends WebSecurityConfigurerAdapter {/*** <p>用來(lái)配置用戶簽名服務(wù),主要是user-detail機(jī)制,還可以給與用戶賦予角色* */@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {// TODO Auto-generated method stubsuper.configure(auth);}/*** <p>用來(lái)配置Filter鏈* */@Overridepublic void configure(WebSecurity web) throws Exception {// TODO Auto-generated method stubsuper.configure(web);}/*** <p>用來(lái)配置攔截保護(hù)請(qǐng)求,比如什么請(qǐng)求放行,什么請(qǐng)求需要驗(yàn)證* */@Overrideprotected void configure(HttpSecurity http) throws Exception {// TODO Auto-generated method stubsuper.configure(http);} }

前面重寫(xiě)了configure(AuthenticationManagerBuilder auth)實(shí)現(xiàn)了用戶驗(yàn)證和賦予用戶角色權(quán)限。接下來(lái),就需要重寫(xiě)configure(HttpSecurity http)實(shí)現(xiàn)限制請(qǐng)求,如下。

1、重寫(xiě)configure(HttpSecurity http)方法

@Overrideprotected void configure(HttpSecurity http) throws Exception {//限定簽名后的權(quán)限http./**第一段**/authorizeRequests()//限定"/user/welcome"請(qǐng)求賦予ROLE_USER 或者 ROLE_ADMIN.antMatchers("/user/welcome", "/user/details").hasAnyRole("USER", "ADMIN")//限定"/admin/**"下所有請(qǐng)求權(quán)限賦予ROLE_ADMIN.antMatchers("/admin/**").hasAnyAuthority("ROLE_ADMIN")//其它路徑允許簽名后訪問(wèn).anyRequest().permitAll()/**第二段**///對(duì)于沒(méi)有配置權(quán)限的其它請(qǐng)求允許匿名訪問(wèn).and().anonymous()//使用Spring Security的默認(rèn)登錄頁(yè)面.and().formLogin()//HTTP基礎(chǔ)驗(yàn)證.and().httpBasic();}

2、現(xiàn)身說(shuō)法

上面的配置,擁有ADMIN權(quán)限的可以訪問(wèn)"/admin/**"路徑下的所有,擁有USER權(quán)限或ADMIN的可以訪問(wèn)"/user/welcome"和"/user/details",其它路徑可以匿名訪問(wèn)。

對(duì)于這里的限制請(qǐng)求配置,明顯產(chǎn)生了權(quán)限沖突,針對(duì)此問(wèn)題,Spring Security采取了配置優(yōu)先原則來(lái)解決,比如上面第二段允許匿名的訪問(wèn),且沒(méi)有給出uri地址,但是第一段中加入了限制,還是會(huì)采取第一段的限制訪問(wèn)。

因此,生產(chǎn)中,需要把具體的配置防止前面,把不具體的配置放到后面。

還應(yīng)該注意方法上是否需要加上"ROLE_"的區(qū)別。

另外,除了使用上面的Ant風(fēng)格編碼,還可以使用正則規(guī)則,例如

http.authorizeRequests().regexMatchers("/user/welcome", "/user/details").hasAnyRole("USER", "ADMIN").regexMatchers("/admin/.*").hasAnyAuthority("ROLE_ADMIN").and().formLogin().and().httpBasic();

3、其它權(quán)限方法說(shuō)明

方法說(shuō)明
access(String)參數(shù)為Spring EL,如果返回true則允許訪問(wèn),需要配合Spring EL表達(dá)式使用
anonymous()允許匿名訪問(wèn)
authorizeRequests()限定通過(guò)簽名的請(qǐng)求
anyRequest()限定任意的請(qǐng)求
hasAnyRole(String ...)將訪問(wèn)權(quán)限賦予多個(gè)角色(角色會(huì)自動(dòng)加入前綴"ROLE_"
hasRole(String)將訪問(wèn)權(quán)限賦予一個(gè)角色(角色會(huì)自動(dòng)加入前綴"ROLE_")
permitAll()無(wú)條件允許訪問(wèn)
and()連接詞,并取消之前限定的前提規(guī)則
httpBasic()啟用瀏覽器的HTTP基礎(chǔ)驗(yàn)證
formLogin()啟用Spring Security默認(rèn)的登錄頁(yè)面
not()對(duì)其它方法的訪問(wèn)采取求反
fullyAuthorized()如果是完整驗(yàn)證(并發(fā)Remember-me),則允許訪問(wèn)
denyAll()無(wú)條件不允許任何訪問(wèn)
hasIpAddress(String)如果是給定的IP地址則允許訪問(wèn)
rememberme()用戶通過(guò)Remember-me功能驗(yàn)證就允許訪問(wèn)
hasAnyAuthority(String ...)如果是給定的多個(gè)角色就允許訪問(wèn)(角色不會(huì)自動(dòng)加入前綴"ROLE_")
hasAuthority(String)如果是給定的一個(gè)角色就允許訪問(wèn)(角色不會(huì)自動(dòng)加入前綴"ROLE_")

4、使用Spring EL表達(dá)式配置訪問(wèn)權(quán)限(等價(jià)于Ant風(fēng)格配置)

@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests()//使用Spring EL 表達(dá)式現(xiàn)在只有角色ROLE_USER或者ADMIN.antMatchers("/user/**").access("hasRole('USER') or hasRole('ADMIN')")//設(shè)置訪問(wèn)權(quán)限給角色ADMIN,要求是完整登錄(非記住我登錄).antMatchers("/admin/welcome1").access("hasAuthority('ROLE_ADMIN') && isFullyAuthenticated()")//設(shè)置訪問(wèn)權(quán)限給角色ADMIN,允許使用非完整登錄(使用記住我登錄).antMatchers("/admin/welcome2").access("hasAuthority('ROLE_ADMIN')")//使用記住我功能.and().rememberMe()//Spring Security默認(rèn)登錄頁(yè)面.and().formLogin()//http基礎(chǔ)驗(yàn)證.and().httpBasic(); }

上面的代碼中,在access()方法里用了3個(gè)Spring表達(dá)式,除此之外,Spring Security還提供了以下表達(dá)式方法:

方法說(shuō)明
authentication()用戶認(rèn)證對(duì)象
denyAll()拒絕任何訪問(wèn)
hasAnyRole(String ...)賦予一個(gè)或多個(gè)角色權(quán)限,會(huì)自動(dòng)加上"ROLE_"
hasRole(String)賦予一個(gè)角色權(quán)限,會(huì)自動(dòng)加上"ROLE_"
hasIpAdress(String)是否請(qǐng)求來(lái)自指定IP
isAnonymous()是否匿名訪問(wèn)
isAuthenticated()是否用戶通過(guò)認(rèn)證簽名
isFullyAuthenticated()限制完整登錄(非記住我功能)
isRememberMe()是否通過(guò)"記住我"功能通過(guò)驗(yàn)證
hasAuthority(String)賦予一個(gè)角色權(quán)限,需要手動(dòng)加上"ROLE_"
hasAnyAuthority(String ...)賦予一個(gè)或多個(gè)角色權(quán)限,需要手動(dòng)加上"ROLE_"
permitAll()無(wú)條件允許任何訪問(wèn)
principal()用戶的principal對(duì)象

強(qiáng)制使用HTTPS

1、簡(jiǎn)單的示例

@Overrideprotected void configure(HttpSecurity http) throws Exception {http//使用安全渠道,強(qiáng)制使用https.requiresChannel().antMatchers("/admin/**").requiresSecure().and()//不使用https.requiresChannel().antMatchers("/user/**").requiresInsecure().and()//限定角色訪問(wèn)權(quán)限.authorizeRequests().antMatchers("/admin/**").hasAnyRole("ADMIN").antMatchers("/user/**").hasAnyRole("ROLE", "ADMIN"); }

2、現(xiàn)身說(shuō)法

這里的requiresChannel()方法說(shuō)明使用通道,然后antMatchers()是一個(gè)限定請(qǐng)求,然后requiresSecure()表示使用HTTPS請(qǐng)求,而requiresInsecure()則是取消安全請(qǐng)求的限制,這樣就可以使用普通的HTTP。

防止跨站點(diǎn)偽造請(qǐng)求

Spring Security在默認(rèn)的情況下,是已經(jīng)開(kāi)啟了防止CSRF攻擊的過(guò)濾器,如果需要關(guān)閉(當(dāng)然是不建議),可以這么做:

http.csrf().disable().authorizeRequests()...

Spring Security會(huì)為每次需要提交的表單提供一個(gè)key-value形式的參數(shù),這個(gè)信息不存在Cookie中,所以無(wú)法偽造,然后根據(jù)客戶端傳遞的參數(shù)和服務(wù)端比較,正確才會(huì)放行。

用戶認(rèn)證功能

1、自定義登錄頁(yè)面并使用"記住我"功能

簡(jiǎn)單的示例

http//設(shè)置角色訪問(wèn)權(quán)限.authorizeRequests().antMatchers("/admin/**").hasRole("ADMIN").and()//啟用remember me功能.rememberMe().tokenValiditySeconds(86400).key("remember-me-key").and()//啟用HTTP Basic功能.httpBasic().and()//通過(guò)簽名后可以訪問(wèn)任何路徑.authorizeRequests().antMatchers("/**").permitAll().and()//設(shè)置默認(rèn)的登錄頁(yè)和跳轉(zhuǎn)路徑.formLogin().loginPage("/login/page").defaultSuccessUrl("/admin/welcome1");

現(xiàn)身說(shuō)法

這里的?rememberMe()方法就是啟用"記住我"功能,有效時(shí)間為86400s(即1天),在瀏覽器中以Cookie存儲(chǔ),鍵"remember-me-key"。loginPage()方法設(shè)置默認(rèn)的登錄頁(yè),defaultSuccessUrl()方法設(shè)置默認(rèn)的跳轉(zhuǎn)路徑。

這里的"/login/page"所映射的路徑,可以使用傳統(tǒng)的Controller控制層去映射,也可以使用新增映射關(guān)系去完成,如下:

@Configuration public class WebConfig implements WebMvcConfigurer {/*** <p>新增映射關(guān)系* */@Overridepublic void addViewControllers(ViewControllerRegistry registry) {//使得/login/page映射為login.jspregistry.addViewController("/login/page").setViewName("login");//使得/logout/page映射為logout_welcome.jspregistry.addViewController("/logout/page").setViewName("logout_welcome");//使得/logout映射為logout.jspregistry.addViewController("/logout").setViewName("logout");} }

注意

登錄頁(yè)面的參數(shù)名必須是賬號(hào):username、密碼:password、記住我:remember-me,且記住我為一個(gè)checkbox,這樣Spring Security才能獲取這些參數(shù),且提交方式必須為POST。

2、啟用HTTP Basic認(rèn)證

在前面調(diào)用httpBasic()方法就是啟動(dòng)了HTTP Basic功能。還可以調(diào)用realmName(String)方法為認(rèn)證設(shè)置模態(tài)對(duì)話框的標(biāo)題。

3、登出

默認(rèn)情況下,Spring Security會(huì)提供一個(gè)URI--"/logout",用POST請(qǐng)求了這個(gè)uri,Spring Security就會(huì)推出,且清楚remember me的相關(guān)信息。仿造自定義登錄,也可以實(shí)現(xiàn)自定義推出。

總結(jié)

以上是生活随笔為你收集整理的Spring Boot实践 | 利用Spring Security快速搞定权限控制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。