zoukankan      html  css  js  c++  java
  • 在spring security3中使用自定义的MD5和salt进行加密

    首先看代码:

    1. <authentication-manager alias="authenticationManager">
    2. <authentication-provider user-service-ref="myUserDetailsService">
    3. <password-encoder ref="myPasswordEncode">
    4. <salt-source user-property="salt"/>
    5. </password-encoder>
    6. </authentication-provider>
    7. </authentication-manager>
    1. <beans:bean id="myPasswordEncode" class="pw.bany.security.MyPasswordEncode">
    2. <beans:constructor-arg name="encode" value="md5"></beans:constructor-arg>
    3. </beans:bean>


    如果我们要自己控制密码权限的验证,可以在配置中使用<password-encoder ref="myPasswordEncode">来指定自己的密码验证类,该类继承自MessageDigestPasswordEncoder。需要我们复写了public boolean isPasswordValid(String savePass, String submitPass, Object salt)方法,如果返回true,表示验证通过。上面代码还为MyPasswordEncode传入encode属性,来设置MyPasswordEncode中encode(本文下面的代码没有用到)。这样在isPasswordValid就可以用到需要加密的算法。isPasswordValid中savePass为数据库中加密保存的密码,submitPass为用户登录时提交的明文密码。 

    1. @Override
    2. // 如果返回true,则验证通过。
    3. public boolean isPasswordValid(String savePass, String submitPass,
    4. Object salt) {
    5. return savePass.equalsIgnoreCase(Util.MD5WithSalt(submitPass,
    6. salt.toString()));
    7. }

    Util.MD5WithSalt(submitPass,salt.toString()),是我们的加密方法,此处没贴出源码,网上很多。这里的salt需要特别注意一下,怎么才能把数据库中的salt传过来的问题。

    上面配置中使用了<salt-source user-property="salt"/>来指定salt,但是系统是怎么知道在数据库中的salt字段呢?其实这里实际上是指定了org.springframework.security.core.userdetails.User中的一个属性,但是这个类中并没有这个属性,此时,需要我们重写这个类,为该类加入salt属性。

    1. package pw.bany.security;
    2. import java.util.Collection;
    3. import org.springframework.security.core.GrantedAuthority;
    4. import org.springframework.security.core.userdetails.User;
    5. public class SaltedUser extends User {
    6. private String salt;
    7. public SaltedUser(String username, String password, boolean enabled,
    8. boolean accountNonExpired, boolean credentialsNonExpired,
    9. boolean accountNonLocked,
    10. Collection<? extends GrantedAuthority> authorities, String salt) {
    11. super(username, password, enabled, accountNonExpired,
    12. credentialsNonExpired, accountNonLocked, authorities);
    13. this.salt = salt;
    14. }
    15. public String getSalt() {
    16. return salt;
    17. }
    18. public void setSalt(String salt) {
    19. this.salt = salt;
    20. }
    21. }

    完成这里之后,还是不够的,因为重载的类只是有了这个属性,但是还是不知道如何从数据库中获取。要做到这个其实很简单,我们只需要修改myUserDetailsService中loadUserByUsername的返回值:

    1. @Override
    2. public UserDetails loadUserByUsername(String username)
    3. throws UsernameNotFoundException {
    4. Collection<GrantedAuthority> auths = new ArrayList<GrantedAuthority>();
    5. User user = null;
    6. try {
    7. user = userDao.getUserByName(username);
    8. if (user == null)
    9. throw new UsernameNotFoundException("用户" + username + "不存在!");
    10. List<String> rolenames = userDao.loadRolesByUserName(username);
    11. System.err.println("用户拥有角色有:");
    12. for (String rolename : rolenames) {
    13. SimpleGrantedAuthority authority = new SimpleGrantedAuthority(
    14. rolename);
    15. auths.add(authority);
    16. System.err.println(rolenames);
    17. }
    18. } catch (Exception e) {
    19. e.printStackTrace();
    20. }
    21. System.err.println(auths.size());
    22. boolean isEnabled = true;
    23. boolean accountNonExpired = true;
    24. boolean credentialsNonExpired = true;
    25. boolean accountNonLocked = true;
    26. if (!user.getStatus().equalsIgnoreCase("enabled")) {
    27. isEnabled = false;
    28. }
    29. return new SaltedUser(user.getUsername(), user.getPassword(),
    30. isEnabled, accountNonExpired, credentialsNonExpired,
    31. accountNonLocked, auths, user.getSalt());
    32. }

    如上面红色代码部分,一看便知。
     

    原文地址:https://blog.csdn.net/zavens/article/details/17165833
  • 相关阅读:
    Linux用户组管理及用户权限3
    MySQL预处理和事务
    MySQL-子查询和多表联查
    Mysql-分组和聚合函数
    LNMP搭建
    apache-虚拟主机配置
    Apache-重写
    apache配置文件详解
    vim使用
    php-curl_init函数
  • 原文地址:https://www.cnblogs.com/jpfss/p/11022011.html
Copyright © 2011-2022 走看看