1
起源
最近,工作环境要求引入权限管理系统,提出了四个可能的方案,大致是:
第一种:自我设计与实现;
第二种:参考现有较为成熟的框架,如若依系统中的spring-security,或开源的shiro。
第三种:参考现有系统,复制其数据表,直接在其权限框架下做业务;
第四种:其他。
本文就来自于我对shiro的调研情况。
shiro是什么
shiro,官网地址:https://shiro.apache.org/,从其官网地址不难猜出,其是apache基金会下的一个开源项目。
根据其介绍,Shiro是一个功能强大且易于使用的Java安全框架,它执行身份验证、授权、加密和会话管理。
废话少说,看代码!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| @Test public void testHelloworld() { Factory<org.apache.shiro.mgt.SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini"); org.apache.shiro.mgt.SecurityManager securityManager = factory.getInstance(); SecurityUtils.setSecurityManager(securityManager); Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken("zhang", "123"); try { subject.login(token); } catch (AuthenticationException e) { } Assert.assertEquals(true, subject.isAuthenticated()); subject.logout(); }
|
这个验证的例子是官网以及一个博主发的例子,其中我们将配置文件shiro.ini
配置为以下内容:
1 2 3
| realm=com.xxx.test.Realm securityManager.realm=$realm
|
对应的Realm文件内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| package com.holdoa.test;
import com.holdoa.core.model.SysUser; import org.apache.shiro.authc.*; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection;
public class Realm extends AuthorizingRealm {
@Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
return null; }
@Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken; token.getUsername(); Object principal = token.getPrincipal(); Object credentials = token.getCredentials();
SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(principal, credentials, getName()); return simpleAuthenticationInfo; } }
|
经过运行,我们发现代码成功的在Realm第二个方法被断点解惑,从而我们可以在这里嵌入我们数据库的以及特定算法要求来验证登录是否正确,很简单吧!
说回四个方案
文章开头提到的四种方案,我个人倾向于“第一种+第三种”,借鉴若依框架的实现逻辑,结合现有数据库结构来实现。
现有的框架前后端分离,权限管理系统首先要做满足的一点是可以通过纯后台的配置来修改权限,而不需要前端做修改,这需要将前端页面的路由信息动态生成,即:用户登录 -> 获取用户角色 -> 返回用户权限-> 返回用户路由列表。
其中,“用户权限”一方面控制用户路由,另一方面控制每个路由页面上的按钮的显示情况。