shiro是一框简易的认证授权的开源框架,开源使用它快速的完成权限管理。网上的资料很多,具体详细的就不多说了,这里只记录下怎么快速的使用:
shiro的架构图如下:
上面的架构图,开源看出用户信息和权限信息都在Realm中,在Authenticator中进行认证,在Authorizer中进行授权。
SessionManager是session管理器,SessionDao是把session存入到缓存中,CacheManager是缓存管理器,前面的这些组件都是属于Security Manager的管理范围。
一,Shiro的认证
下面会进行shiro认证的小demo,上图是认证的流程,shiro的认证主要分为两步:
1,构建SecurityManager环境
2,主体提交认证请求
/**
* 1,认证
*/
public static void testAuthentication1() {
//创建一个SimpleAccountRealm
SimpleAccountRealm simpleAccountRealm = new SimpleAccountRealm();
//添加一个账号
simpleAccountRealm.addAccount("jack", "123456");
//1,构建SecurityManager环境
DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
//设置Realm
defaultSecurityManager.setRealm(simpleAccountRealm);
//2,主体提交认证请求
SecurityUtils.setSecurityManager(defaultSecurityManager);
//获取主体
Subject subject = SecurityUtils.getSubject();
//用户名和密码的token
UsernamePasswordToken token = new UsernamePasswordToken("jack", "123456");
//进行登入
subject.login(token);
System.out.println("是否权限认证:isAuthenticated=" + subject.isAuthenticated());
//登出logout
subject.logout();
System.out.println("是否权限认证:isAuthenticated=" + subject.isAuthenticated());
}
上面是具体的实现代码,如果登入的信息中用户名或者密码错误就会抛出异常。
subject.isAuthenticated()方法判断是否认证成功了。
subject.login(token);用于主体提交认证
subject.logout();实现登出
二,授权,角色检查
上面的小demo是shiro实现认证的一个过程,做权限管理的时候,分为两块,一个认证,一个是授权,认证是判断用户是否账号密码正确,授权是判断用户登入以后有什么权限(菜单权限,CRUD权限,功能权限)
授权的过程也很简单,请看下面的小demo:
/**
* 2,授权
*/
public static void testAuthentication2() {
//创建一个SimpleAccountRealm
SimpleAccountRealm simpleAccountRealm = new SimpleAccountRealm();
//添加一个账号,并赋予一个权限
//simpleAccountRealm.addAccount("jack", "123456","admin");
simpleAccountRealm.addAccount("jack", "123456","admin","user");
//1,构建SecurityManager环境
DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
//设置Realm
defaultSecurityManager.setRealm(simpleAccountRealm);
//2,主体提交认证请求
SecurityUtils.setSecurityManager(defaultSecurityManager);
//获取主体
Subject subject = SecurityUtils.getSubject();
//用户名和密码的token
UsernamePasswordToken token = new UsernamePasswordToken("jack", "123456");
//进行登入
subject.login(token);
System.out.println("是否权限认证:isAuthenticated=" + subject.isAuthenticated());
//登入成功以后,检查是否有某个权限
//subject.checkRole("admin");
//检查多个权限
subject.checkRoles("admin","user");
//System.out.println("是否权限认证:isAuthenticated=" + subject.checkRole("admin"));
}
上面的代码注释已经写的很清楚了,其他的就不多啰嗦了,上面的例子主要是用来判断用户是否有角色权限,如果没有会抛出异常,可以自行试验。
源码地址:
总结:
上面只是shiro的开胃小菜,最简单的shiro使用,想要了解的shiro原理的可以看shiro的源码,后面会陆续给出shiro其他学习总结。
欢迎加群交流:331227121