欢迎使用优快云-markdown编辑器

本文介绍了一种基于Apache Shiro框架实现用户权限认证的方法。通过使用INI配置文件和自定义Realm,展示了如何进行用户登录验证及权限管理。文章首先通过INI配置文件方式实现了基本的用户认证过程,并对认证流程进行了详细解析;接着介绍了如何通过自定义Realm进行更灵活的认证操作。

所需要的jar包

百度云连接:http://pan.baidu.com/s/1eRLwkcq

入门案例

first.ini 配置文件

[users]
zhangsan=123
lisi=123

class类


    //shiro实现用户认证
    @Test
    public void test1()
    {
        //1:基于ini配置文件创建SecurityManager的工厂  
        //  配置文件中的信息相当于数据库中的文件信息   
        //  将数据库中的信息拿来对比 
        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:first.ini");

        //2:使用工厂得到SecurityManager实例
        SecurityManager securityManager = factory.getInstance();

        //3:使用SecurityUtils把SecurityManager对象设置到当前环境中
        //  将刚刚得到的对象加载当前程序中  进行使用
        SecurityUtils.setSecurityManager(securityManager);

        //4:得到进行认证的主体:Subject
        //  以上应该是先设置路径     等到的得到了数据后进行对比
        Subject subject = SecurityUtils.getSubject();

        //5:把进行认证的用户名和密码封装成token对象
        //  获得将要对比的对象     
        UsernamePasswordToken token = new UsernamePasswordToken("zhangsan2", "123");

        //6:提交认证
        //  进行对比      
        subject.login(token);

        //7:判断认证是否通过
        //  判断是否对比通过      通过则返回true  失败则返回false
        boolean boo = subject.isAuthenticated();
        System.out.println(boo);


        //用户退出
        // 用户推出相当于将session清空  后对比将对比失败
        subject.logout();//清空session

        boo = subject.isAuthenticated();
        System.out.println(boo);

        /**
         * SecurityManager调用认证器Authenticator进行认证,实际上是Authenticator的子类
         * ModularRealmAuthenticator进行认证,Modular把用户认证的token传给Realm,默认IniRealm
         * 根据token中的用户名去ini配置文件中查找用户名,如果没找到返回null,如果找到了把用户信息返回给ModularRealmAuthenticator,
         * ModularRealmAuthenticator再根据realm返回的信息验证用户输入的密码是否正确
         * 
         * 密码不正确的异常:org.apache.shiro.authc.IncorrectCredentialsException:
         * 用户名不正确:org.apache.shiro.authc.UnknownAccountException: 

         */

    }

使用自定义reaml

shiro-realm.ini 配置文件

[main]
myRealm=com.qianfeng.realm.MyRealm
securityManager.realms=$myRealm

class文件

@Test
    public void test2()
    {
        //使用自定义的realm实现认证
        //  调用自定义的reaml
        Factory<SecurityManager> factory =new IniSecurityManagerFactory("classpath:shiro-realm.ini");

        //从factory工厂中获得secrityManager
        SecurityManager securityManager = factory.getInstance();

        //将securityManager加载到当前环境中
        SecurityUtils.setSecurityManager(securityManager);

        //得到进行认证的路径
        Subject subject = SecurityUtils.getSubject();

        //获得需要验证的路径   
        UsernamePasswordToken token =new UsernamePasswordToken("zhangsan", "123");

        //将数据进行对比
        subject.login(token);

        //得到对比的结果
        boolean boo = subject.isAuthenticated();
        System.out.println(boo);
    }

自定义reaml

package com.qianfeng.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 MyRealm extends AuthorizingRealm{
    //继承父类的接口
   @Override
    public void setName(String name) {
        super.setName("myRealm");
    }


    //认证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(
            AuthenticationToken token) throws AuthenticationException {
        //参数token接收的是认证器传过来的UsernamePasswordToken对象
        String usercode = (String) token.getPrincipal();//得到认证的用户输入的用户名

        //根据用户名去数据库中查找该用户名是否存在
        //....

        //模拟没有查找到:返回null
        if(!usercode.equals("xiaohua"))
            return null;
        //查询出来该用户名
        String password="123";

        //把用户的信息返回给认证器
        SimpleAuthenticationInfo info =new SimpleAuthenticationInfo(usercode, password, this.getName());
        return info;
    }


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

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值