码迷,mamicode.com
首页 > 其他好文 > 详细

shiro自定义realm(五)

时间:2017-07-28 22:24:22      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:catch   dmp   zrc   lfw   ring   pow   vp9   imp   sla   

上一节介绍了realm的作用:

realm:需要根据token中的身份信息去查询数据库(入门程序使用ini配置文件),如果查到用户返回认证信息,如果查询不到返回null。token就相当于是对用户输入的用户名和密码的一个封装。下面就是创建一个用户名密码token:

UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "111111");

Realm结构:

技术分享

 

 自定义realm

package cn.qlq.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。根据上面穿下来的token去数据库查信息,查到返回一个SimpleAuthenticationInfo,查不到返回null
* @author: qlq
* @date :  2017年7月28日下午8:45:52
 */
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中取出身份信息(token代表用户输入的传下来的信息)
        String userCode = (String) token.getPrincipal();

        // 第二步:根据用户输入的userCode从数据库查询
        // ....从数据库查数据
    

        // 如果查询不到返回null
        //数据库中用户账号是zhangsansan
        /*if(!userCode.equals("zhangsansan")){//
            return null;
        }*/
        
        
        // 模拟从数据库查询到密码
        String password = "111111";

        // 如果查询到返回认证信息AuthenticationInfo
        SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(
                userCode, password, this.getName());

        return simpleAuthenticationInfo;
    }

    // 用于授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(
            PrincipalCollection principals) {
        // TODO Auto-generated method stub
        return null;
    }

}

 

 

   配置realm

需要在shiro-realm.ini配置realm注入到securityManager中。

技术分享

 

Java测试:

// 自定义realm测试
        @Test
        public void testCustomRealm() {

            // 创建securityManager工厂,通过ini配置文件创建securityManager工厂
            Factory<SecurityManager> factory = new IniSecurityManagerFactory(
                    "classpath:shiro-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) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            // 是否认证通过
            boolean isAuthenticated = subject.isAuthenticated();

            System.out.println("是否认证通过:" + isAuthenticated);

        }

 

shiro自定义realm(五)

标签:catch   dmp   zrc   lfw   ring   pow   vp9   imp   sla   

原文地址:http://www.cnblogs.com/qlqwjy/p/7252571.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!