Shiro(1):什么是Shiro

Shiro

Shiro 是 Java 的一个安全框架。Shiro可以帮助我们完成:认证、授权、加密、会话管理、与 Web 集成、缓存等一系列的功能.而且与spring Security相比,Shiro更加小而且简易使用.

Shiro的组件

在这里插入图片描述
Subject:即当前用户,在权限管理的应用程序里需要知道谁能够操作什么,谁拥有操作该程序的权利,shiro中则需要通过Subject来提供基础的当前用户信息.这个用户不一定是一个具体的人,与当前应用交互的任何东西都是 Subject

SecurityManager:安全管理器,它是Shiro的核心,管理所有与安全有关的操作和所有的subject.

Realm:Realm是用户的信息认证器和用户的权限人证器,我们需要自己来实现Realm来自定义的管理我们自己系统内部的权限规则。SecurityManager要验证用户,需要从Realm中获取用户。可以把Realm看做是数据源。

简单的身份验证

导入jar包

<dependency>
  		<groupId>org.slf4j</groupId>
  		<artifactId>slf4j-log4j12</artifactId>
  		<version>1.7.2</version>
  	</dependency>
  	<dependency>
  		<groupId>org.slf4j</groupId>
  		<artifactId>slf4j-api</artifactId>
  		<version>1.7.5</version>
  	</dependency>
  	<!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-core -->
	<dependency>
	    <groupId>org.apache.shiro</groupId>
	    <artifactId>shiro-core</artifactId>
	    <version>1.3.2</version>
	</dependency>
	<!-- junit -->
	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>4.9</version>
		<scope>test</scope>
	</dependency>

配置文件 shiro.ini
shiro.ini是用来配置用户的登录名与密码,以及其权限,使得SecurityManager验证是否有该用户以及该用户有什么权限

# 模拟这是数据库中的用户信息
# 表示用户名为root,密码为123,权限为login
[users]
root=123,role
[roles]
role=login

现在暂且不连接数据库,而是认为数据库中有这样一个用户:name = root,password = 123 , 接下来,要对登录进来的用户进行验证,判断其用户名与密码是否与数据库的信息一致.

public static void main(String[] args) {
	//创建SecurityManager工厂,读取配置文件
	//注意导包org.apache.shiro.mgt.SecurityManager
	Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
	//通过SecurityManager工厂获取SecurityManager实例
	SecurityManager securityManager = factory.getInstance();
	//将SecurityManager对象设置到环境中
	SecurityUtils.setSecurityManager(securityManager);
	//通过SecurityUtils获取主体Subject
	Subject subject = SecurityUtils.getSubject();
	//用户登陆的用户名和密码,而ini文件中的用户名和密码相当数据库中的user
	UsernamePasswordToken token = new UsernamePasswordToken("root", "123");
	try {
	    //进行用户身份验证,如果验证失败则抛出异常
	    subject.login(token);
	    //判断用户是否通过验证
	    if (subject.isAuthenticated()) {
		    System.out.println("登陆成功");
		}
	} catch (AuthenticationException e) {
	    e.printStackTrace();
	    System.out.println("用户登陆失败");
	}
    }

如果用户验证成功,则可以进行下一步操作,而如果验证失败则会抛出AuthenticationException异常.
AuthenticationException异常有几个子类,分别表示验证失败的具体原因:
DisabledAccountException(禁用的帐号)LockedAccountException(锁定的帐号)
UnknownAccountException(错误的帐号)ExcessiveAttemptsException(登录失败次数过多)IncorrectCredentialsException (错误的凭证)ExpiredCredentialsException(过期的凭证)
不过一般我们并不需要给出这么明确的错误信息给登陆用户看

猜你喜欢

转载自blog.csdn.net/QEcode/article/details/83411085