本篇文章来自慕课网Shiro安全框架入门视频教程,以下内容为作者观看视频后总结内容。
一、什么是Shiro
- Apache下的一个强大灵活的开源安全框架
- 认证、授权、企业会话管理、安全加密
- 可以帮助快速完成权限管理模块的开发
- 前者简单、灵活-----------后者复杂、笨重
- 前者可以脱离spring------后者不可脱离spring
- 前者权限控制粒度较粗--后者权限控制力度较细
public class AuthenticationTest { SimpleAccountRealm simpleAccountRealm = new SimpleAccountRealm(); @Before public void add(){ simpleAccountRealm.addAccount("yxf", "123"); } @Test public void testAuthentication(){ //1.构建SecurityManager环境 DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager(); defaultSecurityManager.setRealm(simpleAccountRealm); //2.主体提交认证请求 SecurityUtils.setSecurityManager(defaultSecurityManager); Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken("yxf", "123"); subject.login(token); System.out.println("isAuthenticated:" + subject.isAuthenticated()); } }
在上面代码中可见的认证过程,
1、创建一个Realm,并将用户名与密码添加进去。
2、构建SecurityManager环境,将Realm放入安全管理环境中。
3、接收主体提交来的认证请求(这里我们为了方便测试使用手动创建的token)。
4、对请求进行认证。
认证结果:
1、用户已登录:方法将返回true。
2、用户未登录:方法将返回false。
2、用户名不正确:在login方法中,程序将抛出异常org.apache.shiro.authc.UnknownAccountException(未知的用户)。
3、密码不正确:在login方法中,程序将抛出异常org.apache.shiro.authc.IncorrectCredentialsException(非法凭证)。
4、用户名密码都不正确:同2.
五、Shiro授权
生成一个简单授权代码,如下
public class AuthenticationTest { SimpleAccountRealm simpleAccountRealm = new SimpleAccountRealm(); @Before public void add(){ simpleAccountRealm.addAccount("yxf", "123", "admin", "user"); } @Test public void testAuthentication(){ //1.构建SecurityManager环境 DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager(); defaultSecurityManager.setRealm(simpleAccountRealm); //2.主体提交认证请求 SecurityUtils.setSecurityManager(defaultSecurityManager); Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken("yxf", "123"); subject.login(token); //认证 System.out.println("isAuthenticated:" + subject.isAuthenticated()); //授权角色 subject.checkRole("admin"); subject.checkRole("user"); subject.checkRoles("admin", "user"); //授权用户 subject.checkPermission("select"); subject.checkPermissions("select","update"); } }
如上代码中,用户首先经过认证,认证通过,可以进行授权,授权分为角色授权与权限授权。可以一次检查一个角色/权限授权,也可以一次检查多个。如果检查授权不存在,程序将抛出如下异常:
org.apache.shiro.authz.UnauthorizedException: Subject does not have role [user2](无法授权,找不到“user2”角色)
org.apache.shiro.authz.UnauthorizedException: Subject does not have permission [select](无法授权,找不到"select"权限)
六、Realm
Shiro无论是认证还是授权,都需要从Realm中获取数据。
Realm接口中有如下三个接口:
public interface Realm { String getName(); boolean supports(AuthenticationToken token); AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException; }
Realm的体系结构:
一般情况下,最常用的Realm实现类为IniRealm,JdbcRealm以及PropertiesRealm。
IniRealm:
我们自定义Realm只需继承AuthorizingRealm(授权)抽象接口,因为该接口已经继承了AuthenticatingRealm(认证)和CachingRealm(缓存)。