zoukankan      html  css  js  c++  java
  • shiro之自定义realm

    Shiro认证过程
    创建SecurityManager---》主体提交认证---》SecurityManager认证---》Authenticsto认证---》Realm验证
    
    Shiro授权过程
    创建SecurityManager---》主体授权---》ecurityManager授权---》Authorizer授权---》Realm获取角色权限数据

    1.pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>ylht-shiro</artifactId>
            <groupId>com.ylht</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>shiro-test</artifactId>
        <dependencies>
            <!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-core -->
            <dependency>
                <groupId>org.apache.shiro</groupId>
                <artifactId>shiro-core</artifactId>
                <version>1.4.0</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/junit/junit -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.7</version>
                <scope>test</scope>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.45</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.1.6</version>
            </dependency>
    
    
        </dependencies>
    
    </project>

    2.自定义realm(自定义realm可以的编写可以参考源码)

    package com.ylht.shiro.realm;
    
    import org.apache.shiro.authc.AuthenticationException;
    import org.apache.shiro.authc.AuthenticationInfo;
    import org.apache.shiro.authc.AuthenticationToken;
    import org.apache.shiro.authc.SimpleAuthenticationInfo;
    import org.apache.shiro.authz.AuthorizationInfo;
    import org.apache.shiro.authz.SimpleAuthorizationInfo;
    import org.apache.shiro.realm.AuthorizingRealm;
    import org.apache.shiro.subject.PrincipalCollection;
    import org.apache.shiro.util.ByteSource;
    
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.Map;
    import java.util.Set;
    
    public class CustomerRealm extends AuthorizingRealm {
    
    
    
        {
            super.setName("customRealm");
        }
    
        //该方法用来授权
        protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
            //1.从认证信息中获取用户名
            String username = (String) principalCollection.getPrimaryPrincipal();
            //2.从数据库或者缓存中获取用户角色数据
            Set<String> roles = getRolesByUserName(username);
            //3.从数据库或者缓存中获取用户权限数据
            Set<String> permissions = getPermissionsByUserName(username);
    
            SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
            simpleAuthorizationInfo.setRoles(roles);
            simpleAuthorizationInfo.setStringPermissions(permissions);
            return simpleAuthorizationInfo;
        }
    
    
        //该方法用来认证
        protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
            //1.从认证信息中获取用户名
            String username = (String) authenticationToken.getPrincipal();
    
            //2.通过用户名到数据库中获取凭证
            String password = getPwdByUserName(username);
            if (null == password) {
                return null;
            }
            SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(
                    username, password, "customRealm");
            simpleAuthenticationInfo.setCredentialsSalt(ByteSource.Util.bytes("zzz"));
            return simpleAuthenticationInfo;
        }
    
        //模拟数据库
        private String getPwdByUserName(String username) {
            Map<String, String> userMap = new HashMap<String, String>(16);
            userMap.put("kk", "bdd170a94d02707687abc802b2618e19");
            return userMap.get(username);
        }
    
        //模拟数据库
        private Set<String> getRolesByUserName(String username) {
            Set<String> sets = new HashSet<String>();
            sets.add("admin");
            sets.add("user");
            return sets;
        }
    
        //模拟数据库
        private Set<String> getPermissionsByUserName(String username) {
            Set<String> sets = new HashSet<String>();
            sets.add("user:select");
            sets.add("user:update");
            return sets;
        }
    }

    3.测试类(加密方式,盐等)

    package com.ylht.shiro.test;
    
    import com.ylht.shiro.realm.CustomerRealm;
    import org.apache.shiro.SecurityUtils;
    import org.apache.shiro.authc.UsernamePasswordToken;
    import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
    import org.apache.shiro.authz.AuthorizationException;
    import org.apache.shiro.crypto.hash.Md5Hash;
    import org.apache.shiro.mgt.DefaultSecurityManager;
    import org.apache.shiro.subject.Subject;
    import org.junit.Test;
    
    public class CustomRealmTest {
    
        @Test
        public void testCustomRealm() {
            //创建JdbcRealm对象
            CustomerRealm customerRealm = new CustomerRealm();
            //设置JdbcRealm属性
    
            //1.创建SecurityManager对象
            DefaultSecurityManager securityManager = new DefaultSecurityManager();
            //securityManager对象设置realm
            securityManager.setRealm(customerRealm);
    
            //shiro加密
            HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();
            //加密方式
            matcher.setHashAlgorithmName("md5");
            //加密次数
            matcher.setHashIterations(2);
    
            //customerRealm设置matcher
            customerRealm.setCredentialsMatcher(matcher);
    
            //2.主题提交认证
            SecurityUtils.setSecurityManager(securityManager);
            Subject subject = SecurityUtils.getSubject();
    
            //token
            UsernamePasswordToken token = new UsernamePasswordToken("kk", "123456", false);
    
            //认证
            subject.login(token);
            boolean flag = subject.isAuthenticated();
            if (flag) {
                System.out.println("用户认证通过");
            } else {
                System.out.println("用户认证失败");
            }
    
            //角色验证
            try {
                subject.checkRole("admin");
                System.out.println("角色验证通过");
            } catch (AuthorizationException e) {
                System.out.println("角色验证失败");
                e.printStackTrace();
            }
    
            //角色权限验证
            try {
                subject.checkPermission("user:select");
                System.out.println("角色权限验证通过");
            } catch (AuthorizationException e) {
                System.out.println("角色权限验证失败");
                e.printStackTrace();
            }
    
        }
    
        public static void main(String[] args) {
            //Md5Hash md5Hash = new Md5Hash("123456","zzz");
            Md5Hash md5Hash = new Md5Hash("123456");
            System.out.println(md5Hash);
            Md5Hash md5Hash1 = new Md5Hash(md5Hash);
            System.out.println(md5Hash1.toString());
        }
    }
  • 相关阅读:
    字幕文件处理(2)
    使用RelativeLayout控制WebView以及Bottom按钮的位置
    使用ActionBar Tab
    使用自定的Adapter绑定ListView/GridView数据
    Mono.Android 基础
    Azure自动化实例: 复制blog用于备份
    使用C#程序处理PowerPoint文件中的字符串
    SQL语言Select经典语句
    Row_Number() and Rank() in SQL
    C# Main函数中调用异步方法的2种实现
  • 原文地址:https://www.cnblogs.com/ylht/p/10201287.html
Copyright © 2011-2022 走看看