主要内容
shiro是什么
shiro是apache组织开发的框架,主要用于管理系统的授权和权限验证,达到对系统资源进行访问控制的目的。相比spring security,shiro轻量易用。
环境搭建
项目结构:
创建一个maven项目,导入核心jar包。pom依赖信息如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<dependencies> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.4.0</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>RELEASE</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> </dependencies> |
编写shiro项目代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public class Main { @Test public void testHelloWorld(){ IniSecurityManagerFactory factory = new IniSecurityManagerFactory("classpath:shiro.ini"); SecurityManager manager = factory.getInstance(); SecurityUtils.setSecurityManager(manager); Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken("jack", "123"); try{ subject.login(token); }catch(AuthenticationException e){ e.printStackTrace(); } //运行单元测试绿条表示测试的用户名存在且密码正确(验证通过) Assert.assertEquals(true, subject.isAuthenticated()); subject.logout(); } } |
ini配置文件内容
1 2 3 |
[users] jack=123 tom=456 |
一些概念
SecurityManager、Subject、Realm和AuthenticationToken组成shiro的核心。
Subject对象
Subject
对象表示一个应用程序用户的权限/授权信息状态。例如登录的用户是否已经授权,是否拥有某个资源的访问权限等等。
AuthenticationToken
用户名和密码验证是目前最常用的应用程序验证方式。AuthenticationToken是一个接口,该接口最简单的实现类是UsernamePasswordToken
,顾名思义,该类里面包含的信息就是常用的用户名和密码。UsernamePasswordToken封装的数据一般是表单提交过来的数据。
Realm对象
Realm对象可以理解为一个用户信息的数据源。以用户登录为例,当用户填写好表单数据(用户名/密码)之后,提交的表单数据要和Realm里面的数据进行比对,如果Realm中的数据和用户提交的一致,则验证通过。
通常Realm里面的数据是一个后端数据,例如从数据库获取的用户数据(用户名/密码),或者从文件中获取的数据(IniRealm)。我们可以实现自己的Realm,不过,自定义的Realm一般不会直接实现Realm接口,而是继承AuthorizingRealm
,这样会使事情变得更加简单。
Realm中只有一个主要方法:getAuthenticationInfo(AuthenticationToken token)
。该方法只有一个参数AuthenticationToken
,这个参数中有两个方法分别是getPrincipal()
和getCredentials()
,前者通常用于获取用户名,后者的返回值则通常表示一个密码。
SecurityManager对象
实际上,shiro中的授权和验证分别由Authenticator和Authorizer对象负责实现,SecurityManager继承了这两个接口,从而提供了一个更加快捷的验证入口。Subject中的login
方法实际上使用了SecurityManager的login
方法进行信息验证。
SecurityUtils
SecurityUtils是SecurityManager的一个前端类,该类只有三个方法,分别用于获取和设置SecurityManager,还有一个用于获取Subject对象。
转载请注明:Pure nonsense » shiro概述和环境搭建