前言
上文說(shuō)到,Spring Security它是一個(gè)強(qiáng)大的和高度可定制的身份驗(yàn)證和訪問(wèn)控制框架。它提供了一套豐富的功能,用于保護(hù)基于Spring的應(yīng)用程序。
上文又說(shuō)到,在Spring Security中,過(guò)濾器(Filter)是一個(gè)重要的組件,用于處理身份驗(yàn)證、授權(quán)和其他安全相關(guān)的任務(wù)。
Spring Security 過(guò)濾器概述
Spring Security 的過(guò)濾器鏈由多個(gè)過(guò)濾器
組成,每個(gè)過(guò)濾器負(fù)責(zé)處理特定的安全任務(wù)。當(dāng)請(qǐng)求到達(dá)應(yīng)用程序時(shí),它會(huì)依次通過(guò)過(guò)濾器鏈中的每個(gè)過(guò)濾器,直到到達(dá)目標(biāo)資源。
在過(guò)濾器鏈中,每個(gè)過(guò)濾器都可以對(duì)請(qǐng)求進(jìn)行攔截、修改或執(zhí)行其他操作,以確保應(yīng)用程序的安全性。
Spring Security 主要過(guò)濾器介紹
這里先列舉一些Spring Security中常用的過(guò)濾器:
- SecurityContextPersistenceFilter:負(fù)責(zé)將安全上下文存儲(chǔ)在HttpSession中,以便在后續(xù)請(qǐng)求中訪問(wèn)。
- UsernamePasswordAuthenticationFilter:處理基于表單的身份驗(yàn)證。它攔截包含用戶名和密碼的請(qǐng)求,并執(zhí)行身份驗(yàn)證過(guò)程。
- LogoutFilter:處理注銷請(qǐng)求,清除安全上下文和會(huì)話數(shù)據(jù)。
- ExceptionTranslationFilter:捕獲并處理認(rèn)證和授權(quán)過(guò)程中發(fā)生的異常。
- FilterSecurityInterceptor:根據(jù)安全配置決定是否允許訪問(wèn)特定的資源。
更詳細(xì)的請(qǐng)看下圖:
基于JDBC的認(rèn)證實(shí)現(xiàn)
基于JDBC的認(rèn)證是指使用關(guān)系型數(shù)據(jù)庫(kù)(如MySQL、Oracle等)存儲(chǔ)用戶憑據(jù)(用戶名和密碼),并通過(guò)JDBC進(jìn)行身份驗(yàn)證的過(guò)程。
如何實(shí)現(xiàn)基于JDBC的認(rèn)證呢,接下來(lái)我們以一個(gè)課設(shè)作栗子來(lái)學(xué)習(xí)一下!
首先,我們需要在Spring配置中配置數(shù)據(jù)源,以便能夠連接到我們的數(shù)據(jù)庫(kù)。
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/xiaowei"/>
<property name="username" value="xiaoweiya"/>
<property name="password" value="123456"/>
</bean>
我們的數(shù)據(jù)庫(kù)表,也列到這里吧,雖然語(yǔ)句短小精悍:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
password VARCHAR(50) NOT NULL
);
實(shí)現(xiàn)UserDetailsService接口,以便Spring Security能夠查詢數(shù)據(jù)庫(kù)以獲取用戶詳細(xì)信息。在這個(gè)實(shí)現(xiàn)中,我們需要使用JDBC來(lái)查詢用戶表。
@Service
public class JdbcUserDetailsService implements UserDetailsService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
String sql = "SELECT id, username, password FROM users WHERE username = ?";
User user = jdbcTemplate.queryForObject(sql, new Object[]{username}, new BeanPropertyRowMapper<>(User.class));
return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), new ArrayList<>());
}
}
最后,配置Spring Security使用我們的UserDetailsService實(shí)現(xiàn)和JDBC數(shù)據(jù)源。在配置中,我們需要啟用基于表單的身份驗(yàn)證,并設(shè)置安全約束。
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private JdbcUserDetailsService userDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/login").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService);
auth.passwordEncoder(passwordEncoder());
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
在最后的代碼中,我們用到了BCrypt,它是一款加密工具,可以比較方便地實(shí)現(xiàn)數(shù)據(jù)的加密工作。也可以簡(jiǎn)單理解為它內(nèi)部自己實(shí)現(xiàn)了隨機(jī)加鹽處理。那它和MD5加密有什么區(qū)別呢?
使用MD5加密,每次加密后的密文其實(shí)都是一樣的,這樣就方便了MD5通過(guò)大數(shù)據(jù)的方式進(jìn)行破解。
BCrypt生成的密文長(zhǎng)度是60,而MD5的長(zhǎng)度是32。
現(xiàn)在,我們啟動(dòng)項(xiàng)目,當(dāng)用戶嘗試登錄時(shí),Spring Security將調(diào)用我們提供的JdbcUserDetailsService實(shí)現(xiàn)來(lái)驗(yàn)證用戶憑據(jù)。這個(gè)實(shí)現(xiàn)使用JDBC從數(shù)據(jù)庫(kù)中查詢用戶信息,并且返回給Spring Security進(jìn)行驗(yàn)證。如果用戶名和密碼匹配,用戶將被成功認(rèn)證,并獲得訪問(wèn)應(yīng)用程序的權(quán)限。
文章到這里就先結(jié)束了,后續(xù)會(huì)繼續(xù)分享相關(guān)的知識(shí)點(diǎn)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-855634.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-855634.html
到了這里,關(guān)于【Spring Security系列】Spring Security 過(guò)濾器詳解與基于JDBC的認(rèn)證實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!