jwt身份认证和session身份认证的区别_Springboot整合shiro基于url身份认证和授权认证...

4815a0e6453b2d41fee7219acaff78d9.png

权限管理在日常开发中很重要,所以硬着头皮也要啃下来。

ac9d0ba41c2d491746ba9c602eebee61.png

在这里插入图片描述

  • 实现功能:身份认证
  • 对不同页面进行url授权
  • 多表登录解决
  • 同一个页面多role访问

项目完整github地址 欢迎star

springboot一些学习整合完整地址

shiro的四大组件:

  • 身份认证(Authentication)-证明用户身份,通常叫做登陆(login)。
  • 授权(Authorization)-访问控制
  • 加密(Cryptography)-保护或隐藏数据
  • 会话管理(session management)每个用户时间敏感状态

三个核心组件:Subject, SecurityManager 和 Realms.

  • Subject:即“当前操作用户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。但考虑到大多数目的和用途,你可以把它认为是Shiro的“用户”概念。
  • Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。
  • SecurityManager:它是Shiro框架的核心,典型的Facade模式,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。
  • Realm: Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。
  • 从这个意义上讲,Realm实质上是一个安全相关的DAO:它封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。当配置Shiro时,你必须至少指定一个Realm,用于认证和(或)授权。配置多个Realm是可以的,但是至少需要一个。
  • Shiro内置了可以连接大量安全数据源(又名目录)的Realm,如LDAP、关系数据库(JDBC)、类似INI的文本配置资源以及属性文件等。如果缺省的Realm不能满足需求,你还可以插入代表自定义数据源的自己的Realm实现。
  • Shiro内置过滤器,可以实现权限相关的拦截器
  • 常用的过滤器:
  • anon: 无需认证(登录)可以访问
  • authc: 必须认证才可以访问
  • user: 如果使用rememberMe的功能可以直接访问
  • perm: 该资源必须得到资源权限才可以访问
  • role: 该资源必须得到角色权限才可以访问

这里面只用到了身份认证和授权,权限认证只用到了一点点,shiro的原理是封装的过滤器,他能够在访问浏览器前能过自动完成一些内容。

shiro配置主要两部分——shiroconfig和自定义的Realm(继承AuthorizingRealm)。其中,shiroconfig是shiro的主要配置文件,而自定义的Realm主要是重写AuthorizingRealm的两个方法,分别是身份认证和授权认证调用数据库查询比对。而如果需要role访问则需要重写一个filter。

前奏

项目结构:

c2f3750f7c9b71b021de7e4422088dcd.png

在这里插入图片描述

环境:

  • Springboot2
  • mybatis
  • shiro

新建表:

30fedb5c5706d851cbe974454c18147f.png

在这里插入图片描述

对应的bean:

package com.shiro.bean;public class student { private String username; private String password; private String role; private String perm; //省略get set

mybatis简单查询:

package com.shiro.mapper;import com.shiro.bean.student;import org.apache.ibatis.annotations.Mapper;import org.apache.ibatis.annotations.Select;@Mapperpublic interface studentMapper { @Select("select * from student where username=#{name}") student findByName(String name);}

省略html和sql,详细可以到GitHub下载

页面目录,:

shiro核心配置文件(rolesFilter可选)。

UserRealm.java

package com.shiro.config;import com.shiro.bean.student;import com.shiro.mapper.studentMapper;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.subject.PrincipalCollection;import org.apache.shiro.subject.Subject;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;/** * 自定义Realm * @author bigsai * */public class UserRealm extends AuthorizingRealm{ @Autowired(required = false) private studentMapper studentMapper; private final Logger logger= LoggerFactory.getLogger(UserRealm.class); /** * 执行授权逻辑 */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) { logger.info("执行逻辑授权"); //给资源进行授权 SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); //添加资源的授权字符串 //到数据库查询当前登录用户的授权字符串 //获取当前登录用户 Subject subject = SecurityUtils.getSubject(); student user = (student) subject.getPrincipal(); student dbUser = studentMapper.findByName(user.getUsername()); info.addRole(user.getRole());//添加role 和perms role代表角色 perms代表操作,或者动作等。用于颗粒化权限管理 info.addStringPermission(dbUser.getPerm()); System.out.println("user:" dbUser.getPerm()); return info; } /** * 执行认证逻辑 */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0) throws AuthenticationException { System.out.println("执行认证逻辑"); //编写shiro判断逻辑,判断用户名和密码 //1.判断用户名 UsernamePasswordToken token = (UsernamePasswordToken)arg0; student user = studentMapper.findByName(token.getUsername()); if(user==null){ //用户名不存在 return null;//shiro底层会抛出UnKnowAccountException } //2.判断密码 return new SimpleAuthenticationInfo(user,user.getPassword(),""); }}

rolesFilter

package com.shiro.config;import org.apache.shiro.subject.Subject;import org.apache.shiro.web.filter.authz.AuthorizationFilter;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;// AuthorizationFilter抽象类事项了javax.servlet.Filter接口,它是个过滤器。public class rolesFilter extends AuthorizationFilter { @Override protected boolean isAccessAllowed(ServletRequest req, ServletResponse resp, Object mappedValue) throws Exception { Subject subject = getSubject(req, resp); String[] rolesArray = (String[]) mappedValue; if (rolesArray == null || rolesArray.length == 0) { //没有角色限制,有权限访问 return true; } for (int i = 0; i < rolesArray.length; i ) { if (subject.hasRole(rolesArray[i])) { //若当前用户是rolesArray中的任何一个,则有权限访问 return true; } } return false; }}

shiroConfig:shiro的主要配置

package com.shiro.config;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 javax.servlet.Filter;import java.util.LinkedHashMap;import java.util.Map;/** * Shiro的配置类 * * @author bigsai */@Configurationpublic class ShiroConfig { /** * 创建ShiroFilterFactoryBean */ @Bean public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); //设置安全管理器 shiroFilterFactoryBean.setSecurityManager(securityManager); Map filtersMap = new LinkedHashMap<>(); filtersMap.put("rolesFilter
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值