spring security作爲spring的親兒子,在進行web開發的時候,可以進行一個優雅的權限控制。筆者說來慚愧,工作n多年一直沒有機會深入研究此框架。如有不對的地方望大家指正。
spring boot引入
maven引入jar
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
spring security入門很簡單,引入jar之後,spring security默認會對所有的後臺接口進行權限控制。引入之後隨意訪問接口都需要登錄
默認賬號:user
。 密碼每次啓動會在控制檯進行打印,如下圖。輸入賬號密碼即可。
至此spring security已經引入成功,但是如此並不能完成正常的開發。總會有很多問題,如何實現自己的賬號密碼登錄呢?這個session是怎麼控制的,多臺服務器之後怎麼處理等等。接下來進行示例。
自定義用戶認證
默認的登錄不能實現我的需求,賬號密碼驗證我要自己實現,其他的所有接口都需要登錄之後才能訪問。
聲明密碼加密解密方式
@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
實現UserDetailsService
,這個接口是用來驗證用戶信息的
@Component
public class UserAuthService implements UserDetailsService {
@Autowired
public PasswordEncoder passwordEncoder;
@Override
public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException {
System.out.println("登錄用戶信息:"+userName);
// todo 此處根據用戶信息查詢賬號密碼,這裏返回 111111
// 用戶類型爲admin
// 這裏直接進行加密操作,實際上是從數據庫查詢出來的加密字符串
return new User(userName,passwordEncoder.encode("111111"), AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
}
}
如此操作,即可實現用戶密碼驗證方式。
PasswordEncoder
是框架自帶的一種加密方式,當然我們也可以自己實現加密解密方式。
MD5加密
md5加密工具類
public static String encode(String password) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(password.getBytes());
byte[] byteDigest = md.digest();
int i;
StringBuffer buf = new StringBuffer("");
for (int offset = 0; offset < byteDigest.length; offset++) {
i = byteDigest[offset];
if (i < 0) {
i += 256;
}
if (i < 16) {
buf.append("0");
}
buf.append(Integer.toHexString(i));
}
// 32位加密
return buf.toString();
// 16位加密
// return buf.toString().substring(8, 24);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
}
PasswordEncoder
是加密解密的接口,matches
方法進行對比,encode
方法進行加密。
public class Md5PasswordEncoder implements PasswordEncoder {
@Override
public boolean matches(CharSequence rawPassword, String encodedPassword) {
return encodedPassword.equals(MD5Util.encode((rawPassword.toString())));
}
@Override
public String encode(CharSequence rawPassword) {
return MD5Util.encode((String)rawPassword);
}
}
更多參考資料到:spring security官方地址