全网最简单的shiro教程第三节

Java实现Shiro的认证流程:

 

第一步:

  创建一个基础的maven项目引入shiro以及相关依赖包:
 

 <dependencies>
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-all</artifactId>
            <version>1.4.2</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
    </dependencies>

第二步:自定义Realms继承AuthorizingRealm

public class MyRealm extends AuthorizingRealm {

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

    /**
     *
     * 登录认证
     **/
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
      
        return null;
    }
}

第三步:创建Shiro配置文件为了建立SecurityManager与Realm关联:

#指定Realm与SecurityManager之间的关联
[main]
MySelfReam=com.shiro.MyRealm
securityManager.realm=$MySelfReam

第四步:编写认证测试代码:

这里shiro.ini的路径我使用绝对路径

public class MyRealmMain {


    public static void main(String[] args) {
        
        // 1. 创建管理器工厂
        Factory<SecurityManager> factory =new  IniSecurityManagerFactory("E:\\hadoop_api\\shiro_demo\\src\\main\\resources\\shiro.ini");
        
        //2.创建安全管理器
        SecurityManager manager = factory.getInstance();

        // 3. 初始化SecuritUtils 工具类
        SecurityUtils.setSecurityManager(manager);
        
        // 4.  通过  SecurityUtils 获取subject
        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "123456");
        subject.login(token);

        // 获取认证结果
        Object principal = subject.getPrincipal();
        System.out.println("用户登录成功: "+ principal);


    }
}

第五步:编写认证核心代码:

/**
     *
     * 登录认证
     **/
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        System.out.println("登录认证-------------------");
        UsernamePasswordToken token =  (UsernamePasswordToken) authenticationToken;
        String username = token.getUsername();
        // 验证用户名
        if(!"zhangsan".equals(username)){
            return null;
        }
        //验证密码[密码正确:认证通过,密码不正确:抛出IncorrectCredentialsException]
        AuthenticationInfo info = new SimpleAuthenticationInfo("zhangsan", "123456", "");
        return info;
    }

 

第六步:运行main类中的主函数方法。

 

看到这里可能有小伙伴还是不理解是怎么一个流程,

其实通俗的说就是main函数中的UsernamePasswordToken这个对象中的用户名和密码

传递给了自定义的Realm中的【doGetAuthenticationInfo(AuthenticationToken authenticationToken)】

方法,然后在这个方法能进行用户名密码的比较,如果正确则认证通过用户信息返回,如果不通过就抛出

对应的异常,原理请看下一节。。。。。。。。。。。。。。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值