学习shiro第一天

shiro是一个强大而且易用的安全框架(主要包括认证和授权),它比spring security更加简单,而且它不依赖于任何容器,可以和许多框架集成。

shiro的核心是安全管理器(SecurityManagement),它主要包括四个模块:

1.Authentication:认证模块,主要用于验证subject的身份和凭证,这里的subject包括但不仅限于用户。

2.Authorization:授权模块,主要用于将用户在数据库中对应的角色和权限查询出来并缓存起来供用户后续资源操作的权限判断使用;

3.Session management:会话管理器,管理subject请求会话;

4.cryptography:加密,主要是对凭证加密(单向的,这也正是subject忘记密码了只能创建新密码的原因)。

shiro还支持web,支持缓存机制,支持并发以及单元测试等等。

因为今天我就学了认证模块,所以今天先简单讲讲认证模块的实现。

实现步骤如下:

1.创建一个java项目;

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

2.导入shiro相关的jar包:

commons-beanutils-1.9.3.jar
commons-logging-1.2.jar
jcl-over-slf4j-1.7.12.jar
log4j-1.2.16.jar
shiro-all-1.4.1.jar
slf4j-api-1.7.25.jar
slf4j-log4j12-1.6.4.jar

3.创建shiro的数据文件(这里用.ini文件来提供模拟数据库的数据)

4.编写代码流程

前两步我们这里省略,不会创建项目和导包的请自行百度0 0。

以下是测试用的shiro.ini文件:

[users]
zhangsan=11111

其中[users]是subject存储身份和凭证的目录,下面的zhangsan就是身份,而11111则是凭证或者说密码,这里我们给出的时具体的数据,但实际应用的数据应该是从数据库查询出来的,但我们这边就先这样简单测试。

接下来编写认证代码:

package test;

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.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class TestAuthencation {
    
//日志打印
private final static Logger logger = LoggerFactory.getLogger(TestAuthencation.class);
public static void main(String[] args) { //1.创建securityManagement工厂(读取配置文件) Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
//2.创建securityManagement实例 SecurityManager securityManager = factory.getInstance();
//3.将securityManagement设置进SecurityUtils中 SecurityUtils.setSecurityManager(securityManager);
//4.通过SecurityUtils获取subject实例 Subject subject = SecurityUtils.getSubject();
try { //5.根据用户名和密码获取token UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "1111");
//6.调用subject.login()方法验证用户token subject.login(token);
//7.判断是否验证登陆成功 if(subject.isAuthenticated()) { System.out.println("登陆成功"); } } catch (AuthenticationException e) { // TODO Auto-generated catch block logger.error("用户名或者密码错误!"); } } }

从上面代码可以看到shiro认证的完整流程,其中subject.login(token)这个方法将会跳到shiro的AuthenticatingRealm里面进行用户数据查询认证,当然我们也可以自定义realm,只需要创建一个新的realm类去继承AuthenticatingRealm或者AuthorizingRealm,然后实现认证和授权的方法即可编写自己的认证逻辑。

认证环节可能会发生异常,因此需要我们捕获异常并且打印异常日志,以便排查错误,这里常见的异常有上述代码中的AuthenticationException及它下面的子类异常如UnknowAccountException(用户名错误异常)和IncorrectCredentialsException(用户凭证错误异常)等等,这里需要注意,针对这些异常,我们需要进行模糊的提示,比如上面代码中的用户名或密码错误,而不能说当发生用户名错误异常时直接提示用户用户名异常,这样会让人明确知道错误的时用户名还是密码,会给一些不法人员有机可乘,虽然还有登陆尝试次数过多的异常,但是尽量避免输出明确的提示!

认证流程总结:

1.首先读取.ini文件获取安全管理器的工厂Factory;

2.然后通过工厂来生成SecurityManagement实例;

3.将安全管理器实例设置到SecurityUtils中去;

4.通过SecurityUtils生成Subject;

5.通过UsernamePasswordToken来生成用户令牌(通过传入用户身份和凭证);

6.调用subject.login(token)来对用户信息进行认证;

7.通过subject.isAuthenticated()方法来判断用户是否验证成功;

8.需要对验证部分进行异常捕获,并打印出合理的提示信息日志。

以上是今天我所学到的shiro的认证部分,等我学完授权模块我将会继续更新分享我的学习所得,大家有什么补充和分享的欢迎在评论区留言!

猜你喜欢

转载自www.cnblogs.com/wujianwu/p/11241395.html
今日推荐