• shiro4----shiro3代码


    AuthenticationTest.java

    package cn.itcast.shiro.authentication;
    
    import org.apache.shiro.SecurityUtils;
    import org.apache.shiro.authc.AuthenticationException;
    import org.apache.shiro.authc.UsernamePasswordToken;
    import org.apache.shiro.config.IniSecurityManagerFactory;
    import org.apache.shiro.mgt.SecurityManager;
    import org.apache.shiro.subject.Subject;
    import org.apache.shiro.util.Factory;
    import org.junit.Test;
    
    /**
     * Description: 认证测试
     */
    public class AuthenticationTest {
        // 用户登陆和退出
        @Test
        public void testLoginAndLogout() {
            // 创建securityManager工厂,通过ini配置文件创建securityManager工厂
            Factory<SecurityManager> factory = new IniSecurityManagerFactory(
                    "classpath:shiro-first.ini");
            /*
            ini文件可以实现分组:property文件不能分组。
            [users]
            zhangsan=111111
            lisi=22222*/
            // 创建SecurityManager
            SecurityManager securityManager = factory.getInstance();
            // 将securityManager设置当前的运行环境中
            SecurityUtils.setSecurityManager(securityManager);
            // 从SecurityUtils里边创建一个subject,以后一个http请求就是一个subject。
            Subject subject = SecurityUtils.getSubject();
            // 在认证提交前准备token(令牌)
            // 这里的账号和密码 将来是由用户输入进去
            UsernamePasswordToken token = new UsernamePasswordToken("zhangsan","111111");
            try {
                // 执行认证提交
                subject.login(token);
            } catch (AuthenticationException e) {
                e.printStackTrace();
            }
            // 是否认证通过
            boolean isAuthenticated = subject.isAuthenticated();
            System.out.println("是否认证通过:" + isAuthenticated);//是否认证通过:true
            // 退出操作
            subject.logout();
            // 是否认证通过
            isAuthenticated = subject.isAuthenticated();//是否认证通过:false
            System.out.println("是否认证通过:" + isAuthenticated);
        }
    
        // 自定义realm
        @Test
        public void testCustomRealm() {
            // 创建securityManager工厂,通过ini配置文件创建securityManager工厂
            Factory<SecurityManager> factory = new IniSecurityManagerFactory(
                    "classpath:shiro-realm.ini");//现在用的realm是我们自己自定义的realm,
            //用户名密码是从数据库读取,不再是从ini配置文件读取
            // 创建SecurityManager
            SecurityManager securityManager = factory.getInstance();
            // 将securityManager设置当前的运行环境中
            SecurityUtils.setSecurityManager(securityManager);
            // 从SecurityUtils里边创建一个subject
            Subject subject = SecurityUtils.getSubject();
            // 在认证提交前准备token(令牌)
            // 这里的账号和密码 将来是由用户输入进去
            UsernamePasswordToken token = new UsernamePasswordToken("zhangsan",
                    "111111");
            try {
                // 执行认证提交
                subject.login(token);
            } catch (AuthenticationException e) {
                e.printStackTrace();
            }
            // 是否认证通过
            boolean isAuthenticated = subject.isAuthenticated();
            System.out.println("是否认证通过:" + isAuthenticated);
        }
    
        // 自定义realm实现散列值匹配
        @Test
        public void testCustomRealmMd5() {
            // 创建securityManager工厂,通过ini配置文件创建securityManager工厂
            Factory<SecurityManager> factory = new IniSecurityManagerFactory(
                    "classpath:shiro-realm-md5.ini");
            // 创建SecurityManager
            SecurityManager securityManager = factory.getInstance();
            // 将securityManager设置当前的运行环境中
            SecurityUtils.setSecurityManager(securityManager);
            // 从SecurityUtils里边创建一个subject
            Subject subject = SecurityUtils.getSubject();
            // 在认证提交前准备token(令牌)
            // 这里的账号和密码 将来是由用户输入进去
            UsernamePasswordToken token = new UsernamePasswordToken("zhangsan",
                    "222222");
            try {
                // 执行认证提交
                subject.login(token);
            } catch (AuthenticationException e) {
                e.printStackTrace();
            }
            // 是否认证通过
            boolean isAuthenticated = subject.isAuthenticated();
            System.out.println("是否认证通过:" + isAuthenticated);
        }
    }

    MD5Test.java

    package cn.itcast.shiro.authentication;
    
    import org.apache.shiro.crypto.hash.Md5Hash;
    import org.apache.shiro.crypto.hash.SimpleHash;
    
    public class MD5Test {
        public static void main(String[] args) {
            //原始 密码 
            String source = "111111";
            //
            String salt = "qwerty";
            //散列次数
            int hashIterations = 2;
            //上边散列1次:f3694f162729b7d0254c6e40260bf15c
            //上边散列2次:36f2dfa24d0a9fa97276abbe13e596fc
            
            
            //构造方法中:
            //第一个参数:明文,原始密码 
            //第二个参数:盐,通过使用随机数
            //第三个参数:散列的次数,比如散列两次,相当 于md5(md5(''))
            Md5Hash md5Hash = new Md5Hash(source, salt, hashIterations);
            
            String password_md5 =  md5Hash.toString();
            System.out.println(password_md5);
            //第一个参数:散列算法 
            SimpleHash simpleHash = new SimpleHash("md5", source, salt, hashIterations);
            System.out.println(simpleHash.toString());
            //36f2dfa24d0a9fa97276abbe13e596fc
            //36f2dfa24d0a9fa97276abbe13e596fc
            
            
            
        }
    
    }

    CustomRealm.java

    package cn.itcast.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.realm.AuthorizingRealm;
    import org.apache.shiro.subject.PrincipalCollection;
    
    /**
     * 自定义realm
     */
    public class CustomRealm extends AuthorizingRealm {
        // 设置realm的名称
        @Override
        public void setName(String name) {
            super.setName("customRealm");
        }
        // 用于认证
        @Override
        protected AuthenticationInfo doGetAuthenticationInfo(
                AuthenticationToken token) throws AuthenticationException {
            // token是用户输入的
            // 第一步从token中取出身份信息
            String userCode = (String) token.getPrincipal();
            // 第二步:根据用户输入的userCode从数据库查询
            // ....从数据库查询
            // 如果查询不到返回null
            //数据库中用户账号是zhangsansan
            /*if(!userCode.equals("zhangsansan")){//
                return null;
            }*/
            // 模拟从数据库查询到密码
            String password = "111112";
            // 如果查询到返回认证信息AuthenticationInfo
            SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(
                    userCode, password, this.getName());
            return simpleAuthenticationInfo;
        }
    
        // 用于授权
        @Override
        protected AuthorizationInfo doGetAuthorizationInfo(
                PrincipalCollection principals) {
            return null;
        }
    
    }

    CustomRealmMd5.java

    package cn.itcast.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.realm.AuthorizingRealm;
    import org.apache.shiro.subject.PrincipalCollection;
    import org.apache.shiro.util.ByteSource;
    
    /**
     * 自定义realm
     */
    public class CustomRealmMd5 extends AuthorizingRealm {
        // 设置realm的名称
        @Override
        public void setName(String name) {
            super.setName("customRealmMd5");
        }
        // 用于认证
        @Override
        protected AuthenticationInfo doGetAuthenticationInfo(
                AuthenticationToken token) throws AuthenticationException {
            // token是用户输入的
            // 第一步从token中取出身份信息
            String userCode = (String) token.getPrincipal();
            // 第二步:根据用户输入的userCode从数据库查询
            // ....
    
            // 如果查询不到返回null
            // 数据库中用户账号是zhangsansan
            /*
             * if(!userCode.equals("zhangsansan")){// return null; }
             */
            // 模拟从数据库查询到密码,散列值
            String password = "f3694f162729b7d0254c6e40260bf15c";
            // 从数据库获取salt
            String salt = "qwerty";
            //上边散列值和盐对应的明文:111111
            // 如果查询到返回认证信息AuthenticationInfo
            SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(
                    userCode, password, ByteSource.Util.bytes(salt), this.getName());
            return simpleAuthenticationInfo;
        }
    
        // 用于授权
        @Override
        protected AuthorizationInfo doGetAuthorizationInfo(
                PrincipalCollection principals) {
            return null;
        }
    }

    shiro-first.ini

    shiro-realm-md5.ini

    shiro-realm.ini

  • 相关阅读:
    Codeforces Gym 100571A A. Cursed Query 离线
    codeforces Gym 100500 J. Bye Bye Russia
    codeforces Gym 100500H H. ICPC Quest 水题
    codeforces Gym 100500H A. Potion of Immortality 简单DP
    Codeforces Gym 100500F Problem F. Door Lock 二分
    codeforces Gym 100500C D.Hall of Fame 排序
    spring data jpa 创建方法名进行简单查询
    Spring集成JPA提示Not an managed type
    hibernate配置文件中的catalog属性
    SonarLint插件的安装与使用
  • 原文地址:https://www.cnblogs.com/yaowen/p/8735707.html
Copyright © 2020-2023  润新知