shiro的使用详解~
在家无聊复习一下shiro
打开了之前的项目,由于lombok插件安装不了,不知道idea抽什么风所以get,set方法报错了,将就一下
只看shiro的使用,配置在shiro分类中有
登录方法
package com.zys.sys.controller; import com.zys.sys.common.ActiverUser;
import com.zys.sys.common.ResultObj;
import com.zys.sys.common.WebUtils;
import com.zys.sys.domain.Loginfo;
import com.zys.sys.service.LoginfoService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import java.util.Date; @RestController
@RequestMapping("login")
public class LoginController { @Autowired
LoginfoService loginfoService; @RequestMapping("login")
public ResultObj login(String loginname, String pwd){
//创建Subject对象
Subject subject = SecurityUtils.getSubject();
//先把账号密码传入Shiro里面的UsernamePasswordToken对象里面。
AuthenticationToken token = new UsernamePasswordToken(loginname,pwd);
try{
//调用安全管理器,安全管理器调用自定义Realm 此时先执行i定义realm
subject.login(token);
//登陆成功后就可以通过安全管理器获得用户对象。
ActiverUser activerUser=(ActiverUser) subject.getPrincipal();
System.out.println(activerUser.toString());
WebUtils.getSession().setAttribute("user",activerUser.getUser());
//记录登录日志,插入登录表
System.out.println(WebUtils.getRequest().getRemoteAddr());
Loginfo loginfo = new Loginfo();
loginfo.setLoginname(activerUser.getUser().getName()+"-"+activerUser.getUser().getLoginname());
loginfo.setLoginip(WebUtils.getRequest().getRemoteAddr());
loginfo.setLogintime(new Date());
this.loginfoService.save(loginfo);
return ResultObj.LOGIN_SUCCESS;
}catch (AuthenticationException e){
return ResultObj.LOGIN_ERROR;
}
}
}
自定义realm
package com.zys.sys.UserRealm; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zys.sys.common.ActiverUser;
import com.zys.sys.domain.User;
import com.zys.sys.service.UserService;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy; public class UserRealm extends AuthorizingRealm { @Autowired
@Lazy
UserService userService; @Override
public String getName() {
return this.getClass().getName();
} @Override
//认证方法
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { return null;
} @Override
//授权方法
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
QueryWrapper<User> querywapper = new QueryWrapper<>();
System.out.println(token.getCredentials()+"mmmmmmmmmmmmmmmmmmmmmmmmmmmm");
System.out.println(token.getPrincipal()+"mmmmmmmmmmmmmmmmmmmmmmmmmmmm");
querywapper.eq("loginname",token.getPrincipal().toString());
User user = userService.getOne(querywapper);
if(null != user){
ActiverUser auser = new ActiverUser();
auser.setUser(user);
ByteSource bs = ByteSource.Util.bytes(user.getSalt());
// System.out.println(bs+"----------------------------------");
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(auser,user.getPwd(),bs,this.getName());
return info;
}
return null;
}
}
1.doGetAuthorizationInfo方法
该方法主要是用于当前登录用户授权(作者小白插一句:我实现该方法时只是进行了当前登录用户的角色与权限初始化,至于授权判断估计shiro帮我们做了)
1.调用SecurityUtils.getSubject().isPermitted(String str)方法时会调用doGetAuthorizationInfo方法,SecurityUtils.getSubject().isPermitted(String str)方法返回的是boolean值所以开发者得自定义业务逻辑。
2.在配置文件中配置有类似/**=roles["user"]或者/**=perms[“user”](/**路径是开发者自行定义)的配置的时候会调用doGetAuthorizationInfo方法,这个时候有两种情况:
一、 当当前没有用户登录时shiro会帮我们跳转到login.jsp(默认会找根目录下的login.jsp)
二、当前有登录用户时shiro会自动判定当前登录用户的角色或者权限符合访问当前访问路径,如果不符合那么将跳转到开
发者所配置的未授权提示页面( <property name="unauthorizedUrl" value="/unauthorized.jsp"/>),这种调用情
下doGetAuthorizationInfo方法只会被调用一次,除非更换了当前登录用户。
2.doGetAuthenticationInfo方法
该方法是进行用户验证的
1.调用currUser.login(token)方法时会调用doGetAuthenticationInfo方法,作者小白重写该方法的主要内容是根据提交的用户名与密码到数据库进行匹配,如果匹配到了就返回一个AuthenticationInfo对象否则返回null,同样shiro会帮我们进行判断当返回null的时候会抛出一个异常,开发者可根据该异常进行相应的逻辑处理
shiro的使用详解~的更多相关文章
- (转) shiro权限框架详解06-shiro与web项目整合(上)
http://blog.csdn.net/facekbook/article/details/54947730 shiro和web项目整合,实现类似真实项目的应用 本文中使用的项目架构是springM ...
- Shiro 安全框架详解二(概念+权限案例实现)
Shiro 安全框架详解二 总结内容 一.登录认证 二.Shiro 授权 1. 概念 2. 授权流程图 三.基于 ini 的授权认证案例实现 1. 实现原理图 2. 实现代码 2.1 添加 maven ...
- Shiro 安全框架详解一(概念+登录案例实现)
shiro 安全框架详细教程 总结内容 一.RBAC 的概念 二.两种常用的权限管理框架 1. Apache Shiro 2. Spring Security 3. Shiro 和 Spring Se ...
- Freemarker 的 Shiro 标签使用详解
一.引入依赖(已解决版本冲突) <!-- shiro-freemarker-tags start --> <dependency> <groupId>net.min ...
- shiro.ini 配置详解
引用: [1]开涛的<跟我学shiro> [2]<SpringMVC整合Shiro> [3]<shiro简单配置> [4]Apache shiro集群实现 (一) ...
- Shiro权限管理框架详解
1 权限管理1.1 什么是权限管理 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被 ...
- (转)shiro权限框架详解06-shiro与web项目整合(下)
http://blog.csdn.net/facekbook/article/details/54962975 shiro和web项目整合,实现类似真实项目的应用 web项目中认证 web项目中授权 ...
- (转)shiro权限框架详解05-shiro授权
http://blog.csdn.net/facekbook/article/details/54910606 本文介绍 授权流程 授权方式 授权测试 自定义授权realm 授权流程 开始构造Secu ...
- (转) shiro权限框架详解04-shiro认证
http://blog.csdn.net/facekbook/article/details/54906635 shiro认证 本文介绍shiro的认证功能 认证流程 入门程序(用户登录和退出) 自定 ...
- (转)shiro权限框架详解03-shiro介绍
http://blog.csdn.net/facekbook/article/details/54893740 shiro介绍 本文正式进入主题.本文将介绍如下内容: 什么是shiro 为什么需要学习 ...
随机推荐
- Vue项目中jQuery的引入
1.安装jQuery依赖 npm install jquery --save-dev 2.在webpack.base.conf.js头部加入如下代码 var webpack = require(&qu ...
- nat和静态映射
拓扑图: 实验要求: 1.R2.R3能访问外网的4.4.4.4(4.4.4.4为R4上的环回接口,用来模拟inter网). 2.R4访问222.222.222.100其实访问到的是内网的192.168 ...
- Linux 下如何产生core文件(core dump设置)
转自:https://blog.csdn.net/star_xiong/article/details/43529637 今天在Linux下调试C程序时,出现段错误,习惯性的ls下当前目录,发现没有生 ...
- C++ 快读快写
inline int read() { int s=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; c ...
- POJ2376Cleaning Shifts(区间覆盖贪心)
应该还是蛮简单的一题,但是因为模拟太差,一直没调出来....... \(显而易见的应该按照左区间从小到大排序,相等按照右区间大到小排序\). \(那么第一个区间的l一定要是1,而且必拿(否则没有区间能 ...
- mybatis与hibernate运行流程比较
hibernate长时间没用,感觉生疏了,正好借这篇文章整合下知识,顺便复习比较下两种框架. 概述: Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己 ...
- STM32F767ZI NUCLEO144 基于CubeIDE快速开发入门指南
刚入手的NUCLEO-F767ZI:整合官网资源,理清思路,便于快速进行快发: 文章目录 1 NUCLEO 系列 2 NUCLEO-F767ZI 3 环境搭建 3.1 Keil/IAR安装 3.2 C ...
- IntelliJ Idea14 创建Maven多模块项目,多继承,热部署配置总结(三)
pom.xml中repositories.pluginRepository的作用 pom.xml中repositories标签的作用是: 用来配置maven项目的远程仓库.示例如下: <repo ...
- iview input 禁止输入特殊字符 ,解决中文输入法中input把拼音输入
tips:解决了e.target中输入中文 会把拼音也输入的情况 1 html <FormItem label="角色名称" prop="roleName" ...
- 疑问_网址参数不同的时候改如何选择_MySQL_芬兰站
豹子安全-注入工具-疑问_网址参数不同的时候改如何选择_MySQL_芬兰站_kouvolankipparit.fi_基于联合查询_20200416 www.leosec.net 请看下列GIF视频: