Spring Security 安全認(rèn)證的示例代碼
1.1 動(dòng)態(tài)用戶(hù)
1.1.1 放行資源
如果我們?cè)倥渲玫臅r(shí)候沒(méi)有放行登錄頁(yè)等一些不需要登錄就可以看到的資源,那么訪(fǎng)問(wèn)的時(shí)候就會(huì)全部攔截導(dǎo)致訪(fǎng)問(wèn)不到。所以我們要配置放行一些無(wú)需登錄就可以看到的資源。
<?xml version='1.0' encoding='UTF-8'?><beans:beans xmlns='http://www.springframework.org/schema/security' xmlns:beans='http://www.springframework.org/schema/beans'xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd'> <!-- 設(shè)置頁(yè)面不登陸也可以訪(fǎng)問(wèn) --> <http pattern='/login.html' security='none'></http> <http pattern='/css/**' security='none'></http> <http pattern='/js/**' security='none'></http> <http pattern='/img/**' security='none'></http> <!-- 頁(yè)面的攔截規(guī)則 use-expressions:是否啟動(dòng) SPEL 表達(dá)式 默認(rèn)是 true --> <http use-expressions='false'> <!-- 當(dāng)前用戶(hù)必須有 ROLE_USER 的角色 才可以訪(fǎng)問(wèn)根目錄及所屬子目錄的資源 --> <intercept-url pattern='/**' access='ROLE_USER'/> <!-- 開(kāi)啟表單登陸功能 --> <form-login/> </http> <!-- 認(rèn)證管理器 --> <authentication-manager> <authentication-provider> <user-service> <!-- 配置靜態(tài)用戶(hù) --><user name='admin' password='123456' authorities='ROLE_USER'/> </user-service> </authentication-provider> </authentication-manager></beans:beans>
1.1.2 動(dòng)態(tài)用戶(hù)
我們之前配置的都是再配置文件中靜態(tài)用戶(hù),如果用戶(hù)更改就需要修改配置文件十分的不方便,這個(gè)時(shí)候我們就需要從數(shù)據(jù)庫(kù)中讀取用戶(hù)了。修改時(shí)直接修改數(shù)據(jù)庫(kù)就行了。
☞ 認(rèn)證類(lèi)
/** * Created with IntelliJ IDEA. * * @author Demo_Null * @date 2020/10/12 * @description 認(rèn)證類(lèi) */public class UserDetailsServiceImpl implements UserDetailsService { public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException { // UserDetails 對(duì)象 UserDetails userDetails = null;// 構(gòu)建角色列表 List<GrantedAuthority> grantedAuths = new ArrayList<GrantedAuthority>(); grantedAuths.add(new SimpleGrantedAuthority('ROLE_SELLER')); // 根據(jù)用戶(hù)名獲取用戶(hù) // 判斷用戶(hù)是否存在 if (Objects.equals('admin', s)) { // 構(gòu)建一個(gè) User 返回,Security 會(huì)自動(dòng)核驗(yàn)密碼 userDetails = new User('admin','123456', grantedAuths); } return userDetails; }}
☞ 認(rèn)證管理器
<!-- 認(rèn)證管理器 --><authentication-manager> <authentication-provider user-service-ref='userDetailService'></authentication-provider></authentication-manager><beans:bean class='com.software.controller.UserDetailsServiceImpl'></beans:bean>
1.2 加密
1.2.1 BCrypt 加密算法
用戶(hù)表的密碼通常使用 MD5 等不可逆算法加密后存儲(chǔ),為防止彩虹表破解更會(huì)先使用一個(gè)特定的字符串加密,然后再使用一個(gè)隨機(jī)的 salt(鹽值) 加密。 特定字符串是程序代碼中固定的,salt 是每個(gè)密碼單獨(dú)隨機(jī),一般給用戶(hù)表加一個(gè)字段單獨(dú)存儲(chǔ),比較麻煩。 BCrypt 算法將 salt 隨機(jī)并混入最終加密后的密碼,驗(yàn)證時(shí)也無(wú)需單獨(dú)提供之前的 salt,從而無(wú)需單獨(dú)處理 salt 問(wèn)題。
☞ 配置加密
<!-- 認(rèn)證管理器 --><authentication-manager> <authentication-provider user-service-ref='userDetailService'> <password-encoder ref='passwordEncoder'></password-encoder> </authentication-provider></authentication-manager><beans:bean class='com.software.controller.UserDetailsServiceImpl'></beans:bean><!-- 定義 spring security 安全加密算法對(duì)象 --><beans:bean class='org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder'></beans:bean>
☞ 加密
/** * Created with IntelliJ IDEA. * * @author Demo_Null * @date 2020/10/12 * @description BCrypt 加密 */public class UserDetailsServiceImpl implements UserDetailsService { public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException { // UserDetails 對(duì)象 UserDetails userDetails = null; // 構(gòu)建角色列表 List<GrantedAuthority> grantedAuths = new ArrayList<GrantedAuthority>(); grantedAuths.add(new SimpleGrantedAuthority('ROLE_SELLER')); // 根據(jù)用戶(hù)名獲取用戶(hù) // 判斷用戶(hù)是否存在 if (Objects.equals('admin', s)) { // 模擬密碼已加密 BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder(); String encode = bCryptPasswordEncoder.encode('123456'); // 構(gòu)建一個(gè) User 返回,Security 會(huì)自動(dòng)核驗(yàn)密碼 userDetails = new User('admin',encode, grantedAuths); } return userDetails; }}
1.2.2 自定義加密算法
☞ 自定義加密算法
/** * Created with IntelliJ IDEA. * * @author Demo_Null * @date 2020/10/12 * @description 加密工具類(lèi) */ public class MD5Util { private static final String SALT = 'Demo_Null'; public static String encode(String password) { password = password + SALT; MessageDigest md5 = null; try { md5 = MessageDigest.getInstance('MD5'); } catch (Exception e) { throw new RuntimeException(e); } char[] charArray = password.toCharArray(); byte[] byteArray = new byte[charArray.length]; for (int i = 0; i < charArray.length; i++) byteArray[i] = (byte) charArray[i]; byte[] md5Bytes = md5.digest(byteArray); StringBuffer hexValue = new StringBuffer(); for (int i = 0; i < md5Bytes.length; i++) { int val = ((int) md5Bytes[i]) & 0xff; if (val < 16) {hexValue.append('0'); } hexValue.append(Integer.toHexString(val)); } return hexValue.toString(); }}
☞ 自定義加密
/** * Created with IntelliJ IDEA. * * @author Demo_Null * @date 2020/10/12 * @description 自定義加密算法 */public class MyPasswordEncoder implements PasswordEncoder { @Override public String encode(CharSequence charSequence) { return MD5Util.encode((String)charSequence); } @Override public boolean matches(CharSequence charSequence, String s) { return s.equals(MD5Util.encode((String)charSequence)); }}
☞ 修改安全加密算法對(duì)象
<!-- 認(rèn)證管理器 --> <authentication-manager> <authentication-provider user-service-ref='userDetailService'> <password-encoder ref='passwordEncoder'></password-encoder> </authentication-provider> </authentication-manager> <beans:bean class='com.software.controller.UserDetailsServiceImpl'></beans:bean> <!-- 定義 spring security 安全加密算法對(duì)象 --> <beans:bean class='com.software.controller.MyPasswordEncoder'></beans:bean>
到此這篇關(guān)于Spring Security 安全認(rèn)證的示例代碼的文章就介紹到這了,更多相關(guān)Spring Security 安全認(rèn)證內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. ASP動(dòng)態(tài)網(wǎng)頁(yè)制作技術(shù)經(jīng)驗(yàn)分享2. msxml3.dll 錯(cuò)誤 800c0019 系統(tǒng)錯(cuò)誤:-2146697191解決方法3. ASP中if語(yǔ)句、select 、while循環(huán)的使用方法4. xml中的空格之完全解說(shuō)5. WMLScript的語(yǔ)法基礎(chǔ)6. 匹配模式 - XSL教程 - 47. XML入門(mén)的常見(jiàn)問(wèn)題(四)8. ASP中解決“對(duì)象關(guān)閉時(shí),不允許操作。”的詭異問(wèn)題……9. html小技巧之td,div標(biāo)簽里內(nèi)容不換行10. 解決ASP中http狀態(tài)跳轉(zhuǎn)返回錯(cuò)誤頁(yè)的問(wèn)題
