​ 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默认会对所有的后台接口进行权限控制。引入之后随意访问接口都需要登录

【spring系列】spring security(1)入门_加密解密

​ 默认账号:user。 密码每次启动会在控制台进行打印,如下图。输入账号密码即可。 【spring系列】spring security(1)入门_权限_02

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