spring cloud------spring security简单使用二

上一篇博客是基于内存存用户信息的,但是在我们实际的开发中是不可能通过这种方式的,在实际开发中对用户的账号和密码有各种各样的处理,同时还会对用户的权限也有各种各样的处理。
而本节会讲一下如何对用户密码进行加密以及如何获取权限等
在上一节中我们看到有一个这样的方法

@Autowired
        public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
            DaoAuthenticationProvider au=new DaoAuthenticationProvider();
            au.setUserDetailsService(userDetailsService);
            au.setPasswordEncoder(pd);
            au.setSaltSource(salt);
            auth.authenticationProvider(au);
//          auth.userDetailsService(userDetailsService);
        }

本来直接使用的话很简单,直接auth.setUserDetailsService然后再加你的实现类即可,可是这样的话没有使用到加密,可能有的人会说,我可以在实现层自己做加密处理,虽然这种方法是可以的,但是我们security已经提供哦了我们这种加密的方式,为何我们还要自己去弄呢?不是多此一举吗?好了我们还是基于我们security来讲。
我们要新建一个PasswordConfig类然后去实现PasswordEncoder这个接口,然后去重新这两个方法

@Service
public class PasswordConfig implements PasswordEncoder{

    @Override
    public String encodePassword(String rawPass, Object salt) {
        // TODO Auto-generated method stub
         StringBuffer result = new StringBuffer();
         Md5PasswordEncoder md5 = new Md5PasswordEncoder();
            md5.setEncodeHashAsBase64(true);
            result.append(md5.encodePassword(rawPass, salt));
            return result.toString();
//       return PasswordUtil.encodePassword("MD5", rawPass, salt);
    }

    @Override
    public boolean isPasswordValid(String encPass, String rawPass, Object salt) {
        // TODO Auto-generated method stub
        StringBuffer result = new StringBuffer();
         Md5PasswordEncoder md5 = new Md5PasswordEncoder();
            md5.setEncodeHashAsBase64(true);
            result.append(md5.encodePassword(rawPass, salt));
            if(encPass.equals(result.toString()))
                return true;
            return false;

//       return PasswordUtil.decodePassword(encPass, rawPass, salt);
    }

同时我们还要新建一个PasswordUtil的工具类,这个工具类的目的就是用来加解密的

public class PasswordUtil {
     public static void md5(StringBuffer result, String password, Object salt) {
//          result.append(PasswordType.MD5);
            Md5PasswordEncoder md5 = new Md5PasswordEncoder();
            md5.setEncodeHashAsBase64(true);
            result.append(md5.encodePassword(password, salt));
          }
           /**
      * 加密
      * @param type
      * @param password
      * @param salt
      * @return
      */

     public static String encodePassword(String type, String password, Object salt) {
            StringBuffer result = new StringBuffer();
                md5(result, password, salt);
            return result.toString();
          }
          /**
      * 解密
      * @param secretkey
      * @param password
      * @param salt
      * @return
      */
     public static boolean decodePassword(String secretkey, String password, Object salt) {
            StringBuffer result = new StringBuffer();

            md5(result, password, salt);

            // 验证通过
            if(result.toString().equals(secretkey)){
              return true;
            }
            return false;
          }

因为我们这个是加盐值的,所以我们要建一个这个盐值的实现类,通常我们会将将盐值设置为账号,


@Configuration
public class SaltConfig implements SaltSource{

    @Override
    public Object getSalt(UserDetails user) {
        // TODO Auto-generated method stub
        return user.getUsername();
    }

}

这样我们自定义加密就完成了,然后我们通过DaoAuthenticationProvider 这个方法将我们的加密的类和盐值的类给set进去
,然后在loadUserByUsername方法里面去数据库查找用户的信息,在放到user中即可

猜你喜欢

转载自blog.csdn.net/u013825231/article/details/80468570