先简单介绍一下权限的五张表
用户表:作用---》我是谁---
角色表:作用---》预先定义了一系列的角色
用户角色表:作用---》将用户和角色关联起来
权限表:作用---》预先定义了一系列权限
角色权限表:作用---》将 角色与关联起来,在关联起来的同时也把用户表也关联起来了
用户--->角色--->权限 用户可以间接通过角色查询到权限
安全框架选型:
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;@Configurationpublic class ShiroConfig {/*** 请求过滤* @return*/@Beanpublic 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");//配置登录页面URLshiroFilterFactoryBean.setLoginUrl("/toLogin");//配置未授权的页面shiroFilterFactoryBean.setUnauthorizedUrl("/noAuth");shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);return shiroFilterFactoryBean;}/*** 创建SecurityManager* @param userRealm* @return*/@Beanpublic DefaultWebSecurityManager defaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();defaultWebSecurityManager.setRealm(userRealm);return defaultWebSecurityManager;}/*** 创建Realm* @return*/@Beanpublic UserRealm userRealm(){return new UserRealm();}/*** shiro 配合模板技术去显示隐藏* @return*/@Beanpublic 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 {@Autowiredprivate IUserService userService;@Autowiredprivate IPermissionService permissionService;/*** 执行授权逻辑* @param principalCollection* @return*/@Overrideprotected 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*/@Overrideprotected 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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




