java shiro原理_Springboot shiro认证授权实现原理及实例
关于认证授权,需要的数据表有:用户表,角色表,用户角色关联表,权限表,角色权限关联表,一次如下
之前写过了shiro的登录认证,在自定义的realm中,我们实现AuthorizingRealm接口中的方法:package com.zs.springboot.realm;
import com.zs.springboot.model.User;
import com.zs.springboot.service.UserService;
import com.zs.springboot.util.ResultUtil;
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.util.ByteSource;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
import java.util.Map;
/**
* @author zs
* 登录realm
*/
public class LoginRealm extends AuthorizingRealm {
@Autowired
private UserService userService;
/**
* 授权方法,只有页面出现关于权限标签的时候或者项目中关于授权注解的时候,才可以被使用
* @param principal
* @return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principal) {
User user = (User) principal.getPrimaryPrincipal();
Map resultMap1 = userService.getRoleByUid(user.getUid());
//获取角色,通过多表查询获取用户对应的角色
List roleList = (List) ResultUtil.getResult(resultMap1);
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
info.addRoles(roleList);
//获取权限,通过关联中间表,多表查询出该用户对应的角色所拥有的权限
Map resultMap2 = userService.getPromessionByUid(user.getUid());
List permissionList = (List) ResultUtil.getResult(resultMap2);
info.addStringPermissions(permissionList);
return info;
}
/**
* 认证方法
* @param token
* @return
* @throws AuthenticationException
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
//获取当前登录的用户名
String username = (String) token.getPrincipal();
//根据用户到数据库搜索用户信息
Map login = userService.login(username);
//如果用户不存在则抛出异常
if ((Integer) login.get("code") == 404) {
throw new UnknownAccountException("用户不存在");
}
//如果用户存在,获取用户信息
User user = (User) login.get("result");
//进行认证
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), ByteSource.Util.bytes(user.getSalt()), this.getName());
//将用户信息放入session中,密码制空
Session session = SecurityUtils.getSubject().getSession();
user.setPassword(null);
session.setAttribute("user", user);
return info;
}
}
注意,在授权方法中,principal.getPrimaryPrincipal()方法;如果在认证方法中,simpleAuthenticationInfo对象中传递的第一个参数如果为obj对象,则返回值为对象(可以强转为User对象),如果传递的时username字符串,则返回的是username字符串,字符串是不能强转为User对象的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
java shiro原理_Springboot shiro认证授权实现原理及实例相关推荐
- SpringBoot整合Shiro搭建登录注册认证授权权限项目模板
主要内容: 1 SpringBoot整合Shiro安全框架; 2 Shiro主要学习内容总结;(执行流程.主要对象接口.注意事项等) 3 Redis实现对权限信息缓存; ! 温馨提示: 想要快速搭Sh ...
- 阐述Spring security实现用户认证授权的原理----基于session实现认证的方式
一.认证流程 基于Session认证方式的流程是,用户认证成功后,在服务端生成用户相关的数据保存在session(当前会话),而发 给客户端 sesssion_id 存放到 cookie 中,这样用客 ...
- Shiro入门以及Shiro与web整合
标题Shiro入门以及Shiro与web整合 Shiro框架 - 什么是Shiro? Apache shiro是一个强大,易用的java安全框架执行身份认证,授权,密码和会话管理. Shiro框架的核 ...
- 源码分析shiro认证授权流程
1. shiro介绍 Apache Shiro是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理等功能: 认证 - 用户身份识别,常被称为用户"登录": 授权 - ...
- SpringBoot整合Shiro(认证+授权)
文章目录 Shiro框架简介 Spring Boot整合shiro环境搭建 Shiro实现登录拦截 Shiro框架简介 Apache Shiro是一个强大且易用的Java安全框架,执行身份认证丶授权丶 ...
- 安全认证框架Shiro (二)- shiro过滤器工作原理
安全认证框架Shiro (二)- shiro过滤器工作原理 安全认证框架Shiro 二- shiro过滤器工作原理 第一前言 第二ShiroFilterFactoryBean入口 第三请求到来解析过程 ...
- Shiro 认证授权详解
1 权限管理 1.1用户身份认证 1.1.1 概念 身份认证,就是判断一个用户是否为合法用户的处理过程.最常用的简单身份认证方式是系统通过核对用户输入的用户名和口令,看其是否与系统中存储的该 ...
- shiro+jwt进行认证和授权的解决方案代码实例
文章目录 token类 自定义realm 自定义的jwtFilter用于访问拦截: shiroconfig controller vo对象 测试 jwt和shiro框架就不多介绍了,直接上实例代码吧. ...
- 统一用户认证和单点登录和授权的原理与流程
统一用户认证和单点登录和授权的原理与流程 1 前言 2 介绍 2.1 统一用户认证 2.2 单点登录 2.3 授权 3 原理 3.1 统一用户认证原理 3.2 单点登录原理 3.3 OAuth授权原理 ...
最新文章
- 利用多线程实现报表的高效导出
- Ubuntu18.04安装rabbitmq
- python函数参数列表中的*与**
- How does UDO tool resolve objects
- ASP.NET Core Razor生成Html静态文件
- oracle sql语句 exists
- 科普:手机里的陀螺仪到底是什么
- Android应用开发以及设计思想深度剖析(2)
- Elasticsearch增删改查 之 —— mget多文档查询
- ConnectivityManager
- Windows下安装elastic search
- 直线检测-Radon变换、Hough变换
- 复利,世界第八大奇迹
- 5G无线网络优化覆盖
- Navicat设置mysql时间字段自动获取当前时间
- 计算机房铺设防尘,机房装修施工方案机房防尘漆施工工艺.doc
- oppo小布机器人_OPPO小布助手2.0全新版本来袭,做你身边最聪明的AI语音助手
- springboot毕业设计 基于springboot医院预约挂号系统毕业设计设计与实现参考
- Python基础教程 | 第三章 字符串
- python sys.path用法
热门文章
- ubuntu python3.5安装_ubuntu16.04升级Python3.5到Python3.7的方法步骤
- 搭建mongodb分片
- 洛谷P1816 忠诚 题解
- 洛谷P1091 合唱队形
- CompletableFuture源码详解之java.util.concurrent.CompletableFuture#runAsync(java.lang.Runnable)
- java.lang.OutOfMemoryError处理错误
- push的时候 出现卡顿现象
- Access中出现改变字段“自己主动编号”类型,不能再改回来!(已解决)
- Linux下安装Tomcat7
- 搭建你的Spring.Net+Nhibernate+Asp.Net Mvc 框架