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官方地址