Shiro安全框架--自定义认证

上一篇简单的介绍了Shiro的基础认证,这一篇就简单的举个自定义认证的例子

1.和之前一样先引入依赖:

    <!--导入shiro-web的依赖 -->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-web</artifactId>
            <version>${shiro.version}</version>
        </dependency>
        <!-- 导入shiro-core的依赖 -->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-core</artifactId>
            <version>${shiro.version}</version>
        </dependency>
        <!-- 导入shiro-spring 的依赖-->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>${shiro.version}</version>
        </dependency>

        <!-- 导入/commons-logging的依赖 -->
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>

2.配置好自定义Shiro.ini的信息

#自定义认证的全路径限定名
myreal=com.zking.shiro.MyShrioRealm
securityManager.realms=$myreal

3.创建自定义 MyShiroReaml类 继承 AuthorizingRealm(里面有认证和授权的方法)

  /**
     * 授权
     * @param principalCollection
     * @return
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        return null;
    }

    /**
     * 认证
     * @param authenticationToken
     * @return
     * @throws AuthenticationException
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
       //获取传递过来的数据
        UsernamePasswordToken usernamePasswordToken=(UsernamePasswordToken)authenticationToken;
        String username=usernamePasswordToken.getUsername();
        String pwd=usernamePasswordToken.getPassword().toString();
        String dbpwd="123456";
       //创建返回数据的认证对象 这里的数据要去和数据库的数据进行比对
        //simpleAuthenticationInfo认证数据
        //username根据用户找到密码
        SimpleAuthenticationInfo simpleAuthenticationInfo=new SimpleAuthenticationInfo(username,dbpwd,this.getName());
         //返回认证
        return simpleAuthenticationInfo;
    }

4.在测试类测试

 /**
     * shiro的自定义认证realm
     */
    @Test
    public void test2(){
        //读取配置文件 就会新建一个SecurityManager工厂对象 配置信息就会放到对象里面取 注意包
        Factory<SecurityManager> factory=  new IniSecurityManagerFactory("classpath:shiro2.ini");
        //获取SecurityManager对象
        SecurityManager securityManager=factory.getInstance();
        //将securityManager设置在当前的环境中
        SecurityUtils.setSecurityManager(securityManager);
        //获取当前操作对象
        Subject subject=SecurityUtils.getSubject();
        //实例化令牌
        UsernamePasswordToken usernamePasswordToken=new UsernamePasswordToken("admin","123456");
        //登录 需要一个令牌对象
        subject.login(usernamePasswordToken);
        //输出看认证是否通过
        System.out.println(subject.isAuthenticated());




    }

返回结果为true.

自定义认证是根据名称走的,名称去找到密码,在认证的时候就只认证密码就行啦,这就要求名称是唯一的.

扫描二维码关注公众号,回复: 11434435 查看本文章

猜你喜欢

转载自blog.csdn.net/qqqnzhky/article/details/84347897