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 为什么需要学习 ...
随机推荐
- 线程状态及各状态下与锁和CPU的关系
线程的状态 Thread.State枚举类型中定义了线程的六种状态:NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING和TERMINATED. 线程在某一时刻只能拥有 ...
- XML--XML从入门到精通 Part 1 认识XML
XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 标签没有被预定义.您需要 ...
- HDU Problem D [ Humble number ]——基础DP丑数序列
Problem D Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submi ...
- HDU 1159.Common Subsequence【动态规划DP】
Problem Description A subsequence of a given sequence is the given sequence with some elements (poss ...
- USB设备驱动模型
嵌入式设备驱动的编写,基本上都要按照一定的驱动模型编写.不这么做的话,一旦设备发生了更新和改变,大部分的驱动代码都要推倒重来,代码的重用率低,不具备移植性.所以在新版linux2.6.22以后的内核版 ...
- postman(全局变量设置)
全局变量 全局变量作用于整个postman工具及所有环境 1.点击小齿轮进入到变量添加页面,点击Globals添加全局变量 2.输入变量名称和变量值 3.接口中设置变量 4.调用 Globals 变量 ...
- python-函数变量与方法公有、私有整理
关于函数与方法的区别: 函数: def funname(): 括号里面可以有形参,也可以没有,为空 在函数里面的参数整理: 方法: def funcname(self): 括号里面必须有个self,因 ...
- C# 基础知识系列- 15 异常处理篇
0. 前言 为什么我们需要异常处理?什么是异常? 在汉语中,异常指非正常的:不同于平常的.翻译到程序中,就是指会导致程序无法按照既定逻辑运行的意外,或者说是错误.可能会有小伙伴好奇了,我们的程序不是正 ...
- Coursera课程笔记----C程序设计进阶----Week 1&2
C程序中的函数(Week 1&2) 函数 函数的定义 对函数的普遍认识:y=f(x) C语言中的常用函数: 平方根: r = sqrt(100.0) 底数x的y次幂:k = pow(x,y) ...
- 一阶RC低通滤波器详解(仿真+matlab+C语言实现)
文章目录 1 预备知识 2 simulink 仿真 3 simulink 运行结果 4 matlab实现 5 matlab运行结果 6 C语言实现 7 C语言运行结果 如果本文帮到了你,帮忙点个赞: ...