一、Spring Security內(nèi)部認(rèn)證流程
-
用戶首次登錄提交用戶名和密碼后spring security 的UsernamePasswordAuthenticationFilter把用戶名密碼封裝Authentication對(duì)象
-
然后內(nèi)部調(diào)用ProvideManager的authenticate方法進(jìn)行認(rèn)證,然后ProvideManager進(jìn)一步通過(guò)內(nèi)部調(diào)用DaoAuthencationPriovider的authenticate方法進(jìn)行認(rèn)證
-
DaoAuthencationPriovider通過(guò)調(diào)用UserDetailsService的實(shí)現(xiàn)類InMemoryDetialManager的loadUserByUsername方法查詢用戶,并把查詢到的用戶信息封裝成一個(gè)UserDetails對(duì)象。注意InMemoryDetialManage是從內(nèi)存中查詢用戶信息的,所以我們要定制化實(shí)現(xiàn)UserDetailsService接口來(lái)達(dá)到從數(shù)據(jù)庫(kù)查詢用戶信息。
-
通過(guò)PasswordEncode對(duì)比返回的UserDetails對(duì)象的密碼和Authentication對(duì)象的密碼是否一致,如果密碼正確就把UserDetails中的權(quán)限信息設(shè)置到Authentication對(duì)象中
-
如果成功返回Authentication對(duì)象就使用SecurityContextHolder.getContext().setAuthentication方法存儲(chǔ)改對(duì)象,然后其他過(guò)濾器就會(huì)通過(guò)SecurityContextHolder來(lái)獲取當(dāng)前用戶信息。
二、自定義認(rèn)證流程
我們要定制化實(shí)現(xiàn)UserDetailsService接口來(lái)達(dá)到從數(shù)據(jù)庫(kù)查詢用戶信息,所以重新寫一個(gè)UserDetailsServiceImpl實(shí)現(xiàn)類。然后認(rèn)證通過(guò)使用用戶id生成一個(gè)jwt(也就是token),然后用userId 作為key,用戶信息作為value存入redis中。用戶第一次登陸認(rèn)證流程如下圖。
導(dǎo)入依賴文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-673119.html
<!--SpringSecurity啟動(dòng)器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!--redis依賴-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--fastjson依賴-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<!--jwt依賴-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
</dependency>
UserDetailsServiceImpl代碼文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-673119.html
@Service
public class UserDetailServiceImpl implements UserDetailsService {
@Resource
private UserMapper userMapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//根據(jù)用戶名查詢用戶信息
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(User::getUserName,username);
User user
到了這里,關(guān)于Spring Security進(jìn)行登錄認(rèn)證和授權(quán)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!