暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

权限五表与Shiro

琪友 2020-03-25
484

先简单介绍一下权限的五张表

用户表:作用---》我是谁---

角色表:作用---》预先定义了一系列的角色

用户角色表:作用---》将用户和角色关联起来

权限表:作用---》预先定义了一系列权限

角色权限表:作用---》将 角色与关联起来,在关联起来的同时也把用户表也关联起来了    

用户--->角色--->权限     用户可以间接通过角色查询到权限



安全框架选型:

Shiro:轻量级,功能简单,但能满足90%的需求,学习成本小

SpringSecurity:重量级,功能多,你能想到的官方基本上都想到了,学习成本大


Shiro主要就两个文件配置


ShiroCofig

package com.config;


import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


import java.util.LinkedHashMap;
import java.util.Map;


@Configuration
public class ShiroConfig {


/**
* 请求过滤
* @return
*/
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("defaultWebSecurityManager")DefaultWebSecurityManager defaultWebSecurityManager){


ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
//设置安全管理器
shiroFilterFactoryBean.setSecurityManager(defaultWebSecurityManager);


/**
* 常用的过滤器
* anon:无需认证(登录)可以访问
* authc:必须认证才可以访问
* user:如果使用RemeberMe的功能可以直接访问
* perms:该资源必须得到资源权限才可以访问
* role:该资源必须得到角色权限才可以访问
*/
Map<String,String> filterMap = new LinkedHashMap<>();
// filterMap.put("/add","authc");
// filterMap.put("/update","authc");
filterMap.put("/test","anon");
filterMap.put("/login","anon");
// 授权拦截 , 没权限会跳转到未授权页面
filterMap.put("/add","perms[user:add]");
filterMap.put("/update","perms[user:update]");
// 拦截请求,可以加个一级菜单
filterMap.put("/*","authc");


//配置登录页面URL
shiroFilterFactoryBean.setLoginUrl("/toLogin");
//配置未授权的页面
shiroFilterFactoryBean.setUnauthorizedUrl("/noAuth");


shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);


return shiroFilterFactoryBean;
}


/**
* 创建SecurityManager
* @param userRealm
* @return
*/
@Bean
public DefaultWebSecurityManager defaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
defaultWebSecurityManager.setRealm(userRealm);


return defaultWebSecurityManager;
}


/**
* 创建Realm
* @return
*/
@Bean
public UserRealm userRealm(){
return new UserRealm();
}


/**
* shiro 配合模板技术去显示隐藏
* @return
*/
@Bean
public ShiroDialect getShiroDialect (){
return new ShiroDialect();
}
}


UserRealm
package com.config;


import com.pojo.Permission;
import com.pojo.User;
import com.service.IPermissionService;
import com.service.IUserService;
import org.apache.shiro.SecurityUtils;
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.session.Session;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;


import java.util.Collection;
import java.util.List;


public class UserRealm extends AuthorizingRealm {


@Autowired
private IUserService userService;


@Autowired
private IPermissionService permissionService;
/**
* 执行授权逻辑
* @param principalCollection
* @return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {


//给资源进行授权
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();


//登录者
Subject subject = SecurityUtils.getSubject();
//授权方法传的信息
User user = (User) subject.getPrincipal();
//查询权限
List<Permission> permissions = permissionService.permissions(user.getUsernmae());


for (Permission permission : permissions) {
info.addStringPermission(permission.getPerms());
}
// 查询权限
// User byId = userService.findById(user.getId());
//添加权限
// info.addStringPermission(byId.getPerms());


return info;
}


/**
* 执行认证逻辑
* @param authenticationToken
* @return
* @throws
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {


UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;


User byUser = userService.findByUser(token.getUsername());
if(byUser==null){
//用户名不存在
return null;//shiro自己会抛出UnknownAccountException
}


//往session存登录信息
// Subject currentSubject = SecurityUtils.getSubject();
// Session session = currentSubject.getSession();
// session.setAttribute("loginUser",byUser);


// 第一个 参数是授权方法的 getPrincipal 第二个是密码
return new SimpleAuthenticationInfo(byUser,byUser.getPassword(),"");
}
}



具体代码都放到gitee上面去了,SQL文件在resource的SQL目录,克隆工程导入SQL文件即可运行

https://gitee.com/liuqiyou/SpringBootOne/tree/master/SpringShiro2


文章转载自琪友,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论