zoukankan      html  css  js  c++  java
  • Shiro加密

    Shiro散列配置
    • HashedCredentialsMatcher
    • 自定义Realm中使用散列
    • 盐的使用
    代码演示
    public class CustomRealm extends AuthorizingRealm {
    
        Map<String, String> userMap = new HashMap<>(16);
    
        {
            userMap.put("Mark", "283538989cef48f3d7d8a1c1bdf2008f");
    
            super.setName("customRealm");
        }
    
        @Override
        protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
            String userName = (String) principalCollection.getPrimaryPrincipal();
            // 从数据库或者缓存中获取角色数据
            Set<String> roles = getRolesByUserName(userName);
            Set<String> permissions = getPermissionsByUserName(userName);
            SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
            simpleAuthorizationInfo.setStringPermissions(permissions);
            simpleAuthorizationInfo.setRoles(roles);
            return simpleAuthorizationInfo;
        }
    
        private Set<String> getPermissionsByUserName(String userName) {
            Set<String> sets = new HashSet<>();
            sets.add("user:delete");
            sets.add("user:add");
            return sets;
        }
    
        private Set<String> getRolesByUserName(String userName) {
            Set<String> sets = new HashSet<>();
            sets.add("admin");
            sets.add("user");
            return sets;
        }
    
        @Override
        protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
            // 1. 从主体传过来的认证信息中,获得用户名
            String userName = (String) authenticationToken.getPrincipal();
    
            // 2. 通过用户名到数据库中获取凭证
            String password = getPasswordByUserName(userName);
            if (password == null) {
                return null;
            }
            SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo("Mark", password, "customRealm");
            authenticationInfo.setCredentialsSalt(ByteSource.Util.bytes("Mark"));
            return authenticationInfo;
        }
    
        private String getPasswordByUserName(String userName) {
            return userMap.get(userName);
        }
    
        public static void main(String[] args) {
            Md5Hash md5Hash = new Md5Hash("123456", "Mark");
            System.out.println(md5Hash.toString());
        }
    }
    
    public class CustomRealmTest {
        @Test
        public void testAuthentication() {
            CustomRealm customRealm = new CustomRealm();
    
            // 1. 构建SecurityManager环境
            DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
            defaultSecurityManager.setRealm(customRealm);
    
            HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();
            matcher.setHashAlgorithmName("md5");
            matcher.setHashIterations(1);
            customRealm.setCredentialsMatcher(matcher);
    
            // 2. 主体提交认证请求
            SecurityUtils.setSecurityManager(defaultSecurityManager);
            Subject subject = SecurityUtils.getSubject();
    
            UsernamePasswordToken token = new UsernamePasswordToken("Mark", "123456");
            subject.login(token);
    
            System.out.println("isAuthenticated:" + subject.isAuthenticated());
        }
    
    }
    
  • 相关阅读:
    2020年7月3日 查找算法 代码
    QList 和QStringList为空 at()的错误
    网络编程TCP
    02#2位带操作
    04#认识指针
    03#指针内存图//拓展大小端序
    02#循环控制+分支控制+goto标签//拓展3目运算符和逗号运算符
    01#c语言基础内容
    输入的竖线变横
    Keil打包工程
  • 原文地址:https://www.cnblogs.com/sanjun/p/10003680.html
Copyright © 2011-2022 走看看