具体配置
①给需要权限的处理方法加上权限表达式注解@RequiresPermissions
//第一个参数代表中文权限表达式,第二个参数代表权限表达式
@RequiresPermissions(value = {"员工编辑", "employee:input"}, logical = Logical.OR)
Logical.OR:当多个权限表达式存在时,校验只要有一个即可以
Logical.AND:当多个权限表达式存在时,必须都存在才可以校验
②配置注解扫描器AuthorizationAttributeSourceAdvisor,并添加到安全管理器管理
<!--权限注解扫描器-->
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<!--添加安全管理器-->
<property name="securityManager" ref="securityManager"/>
</bean>
③服务器代码实现注解的加载
//再次加载时不应该出现重复的参数
//先查询出数据库保存的数据,和得到的注解的方法作对比,如果存在则不往数据库添加权限表达式
public void reload() {
//获取到所有控制器的对象
Map<String, Object> beans = application.getBeansWithAnnotation(Controller.class);
System.out.println("application"+beans.entrySet());
//得到控制器对象
Collection<Object> values = beans.values();
//遍历controller对象里的方法
for (Object controller : values) {
//得到控制器里的所有的方法
//获取父类里的方法
Method[] methods = controller.getClass().getSuperclass().getDeclaredMethods();
//遍历控制器里的方法,判断是否有requestPermission注解
for (Method method : methods) {
boolean annotationPresent =
method.isAnnotationPresent(RequiresPermissions.class);
if (annotationPresent) {
//得到当前方法的简单名字
//String methodName = method.getName();
String expression = StringUtils.getExpression(method);
//判断当前表达式的名字是否存在,存在则不保存
List<Permission> permissions = permissionMapper.queryForList(new PermissionQuery());
HashSet<String> set = new HashSet<>();
for (Permission permission : permissions) {
set.add(permission.getExpression());
}
if (!set.contains(expression)) {
Permission permission = new Permission();
permission.setName(method.
getAnnotation(RequiresPermissions.class).value()[0]);
permission.setExpression(method.
getAnnotation(RequiresPermissions.class).value()[1]);
permissionMapper.insert(permission);
}
}
}
}
}
④在自建Realm中实现授权
//获取授权信息
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
//查出所有权限信息
List<Permission> permissions = permissionService.selectAll();
//得到用户,判断是否是超级管理员
Employee employee =(Employee)principalCollection.getPrimaryPrincipal();
if (employee.isAdmin()) {
info.addRole("admin");
//如果是admin,则给予所有的权限
info.addStringPermission("*:*");
}else {
//查询到该用户的角色的编码
List<String> roleList = roleMapper.getRoleIdByEmployeeId(employee.getId());
//查询到该用户的权限信息
List<String> permissionList =
permissionService.getPerssionsByEmployeeId(employee.getId());
//添加该用户的角色信息
info.addRoles(roleList);
//添加该用户的权限信息
info.addStringPermissions(permissionList);
}
//返回授权认证的信息
return info;
}
网友评论