shiro实例(二) 自定义realm

转载地址 https://my.oschina.net/Tsher2015/blog/655162

测试实例:

package com.sojson;

import static org.junit.Assert.*;

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;


public class AuthenticationTest {

    // 用户登陆和退出
        @Test
        public void testLoginAndLogout() {

            // 创建securityManager工厂,通过ini配置文件创建securityManager工厂
            Factory<SecurityManager> factory = new IniSecurityManagerFactory(
                    "classpath:shiro-first.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);

            // 退出操作
            subject.logout();

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

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

        }

        // 自定义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("111",
                    "111111");

            try {
                // 执行认证提交
                subject.login(token);
            } catch (AuthenticationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

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

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

        }

}
自定义的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;

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 = "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;
        }

}

shiro-first.ini文件:

#\u5bf9\u7528\u6237\u4fe1\u606f\u8fdb\u884c\u914d\u7f6e
[users]
#\u7528\u6237\u8d26\u53f7\u548c\u5bc6\u7801
zhangsan=111111
lisi=22222
shiro-realm.ini文件:

[main]
#\u81ea\u5b9a\u4e49 realm
customRealm=cn.itcast.shiro.realm.CustomRealm
#\u5c06realm\u8bbe\u7f6e\u5230securityManager\uff0c\u76f8\u5f53 \u4e8espring\u4e2d\u6ce8\u5165
securityManager.realms=$customRealm

输出结果1:

是否认证通过:true
2016-04-08 15:44:17,593 DEBUG [org.apache.shiro.mgt.DefaultSecurityManager] - Logging out subject with primary principal zhangsan
2016-04-08 15:44:17,594 DEBUG [org.apache.shiro.session.mgt.AbstractSessionManager] - Stopping session with id [b42e8ca0-3896-4796-8238-dd1692ccdbd7]
是否认证通过:false

输出结果2:

是否认证通过:true

posted @ 2017-03-23 16:55  albert_think  阅读(806)  评论(0编辑  收藏  举报