zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    windows常用快捷键
    清华为什么被称为“水木清华”
    CTP程序化系统开发(C++ && PHP)
    PHP判断SESSION过期的方法
    Linux 下 ---ThinkPHP 图片上传提示:上传根目录不存在!请尝试手动创建
    &#65279导致页面顶部空白一行解决方法 【】
    Code笔记 之:ajax诡异的错误-请求status为200
    PHP之:序列化和反序列化-serialize()和unserialize()
    Linux之:Ubuntu速学笔记(1)
    C语言归并排序(合并排序)算法及代码
  • 原文地址:https://www.cnblogs.com/yaowen/p/8735707.html
Copyright © 2011-2022 走看看