在家无聊复习一下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的使用详解~的更多相关文章

  1. (转) shiro权限框架详解06-shiro与web项目整合(上)

    http://blog.csdn.net/facekbook/article/details/54947730 shiro和web项目整合,实现类似真实项目的应用 本文中使用的项目架构是springM ...

  2. Shiro 安全框架详解二(概念+权限案例实现)

    Shiro 安全框架详解二 总结内容 一.登录认证 二.Shiro 授权 1. 概念 2. 授权流程图 三.基于 ini 的授权认证案例实现 1. 实现原理图 2. 实现代码 2.1 添加 maven ...

  3. Shiro 安全框架详解一(概念+登录案例实现)

    shiro 安全框架详细教程 总结内容 一.RBAC 的概念 二.两种常用的权限管理框架 1. Apache Shiro 2. Spring Security 3. Shiro 和 Spring Se ...

  4. Freemarker 的 Shiro 标签使用详解

    一.引入依赖(已解决版本冲突) <!-- shiro-freemarker-tags start --> <dependency> <groupId>net.min ...

  5. shiro.ini 配置详解

    引用: [1]开涛的<跟我学shiro> [2]<SpringMVC整合Shiro> [3]<shiro简单配置> [4]Apache shiro集群实现 (一) ...

  6. Shiro权限管理框架详解

    1 权限管理1.1 什么是权限管理 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被 ...

  7. (转)shiro权限框架详解06-shiro与web项目整合(下)

    http://blog.csdn.net/facekbook/article/details/54962975 shiro和web项目整合,实现类似真实项目的应用 web项目中认证 web项目中授权 ...

  8. (转)shiro权限框架详解05-shiro授权

    http://blog.csdn.net/facekbook/article/details/54910606 本文介绍 授权流程 授权方式 授权测试 自定义授权realm 授权流程 开始构造Secu ...

  9. (转) shiro权限框架详解04-shiro认证

    http://blog.csdn.net/facekbook/article/details/54906635 shiro认证 本文介绍shiro的认证功能 认证流程 入门程序(用户登录和退出) 自定 ...

  10. (转)shiro权限框架详解03-shiro介绍

    http://blog.csdn.net/facekbook/article/details/54893740 shiro介绍 本文正式进入主题.本文将介绍如下内容: 什么是shiro 为什么需要学习 ...

随机推荐

  1. 交换机上的MAC地址表

    拓扑图: 1.首先在R1上的配置: R1(config)#int R1(config)#interface g R1(config)#interface gigabitEthernet 0/0 R1( ...

  2. INTERVIEW #4

    120min, 5题.本菜鸡怒跪. 1.变身程序员 (读取时可以按行读取,直到读到空行为止,再对读取过的所有行做转换处理) 输出描述:如果能将所有的产品经理变成程序员,输出最小的分钟数:如果不能将所有 ...

  3. springboot后端校验

    这一篇讲解了如何定义特殊的校验 https://www.cnblogs.com/cjsblog/p/8946768.html https://blog.csdn.net/xgblog/article/ ...

  4. 前端——Vue-cli 通过UI页面创建项目

    在使用该教程创建项目时请先安装vue ui,具体安装方法请百度 1.打开CMD,输入vue ui 2.点击创建按钮,选择项目目录 3.填写项目名 4.配置项目 选择项目所需要的模块

  5. POJ2686(状压)

    描述: \(m个城市有p条双向道路.道路的花费是道路的距离/票上的数字.给出n张票,求a->b的最短路\). 开始本来想老套路把城市状态来压缩,但城市最多可以有30个,故考虑把船票压缩. 定义\ ...

  6. EditPlus编辑java代码 常规配置

  7. Appium+Python-项目实践一

    一.前言                            前面讲了环境搭建和常用的元素定位,后续会持续以项目实践的方式去慢慢学习以及整理各方面的知识点,具体不会详细阐述,但会贴上完整代码,想要了 ...

  8. 【FreeRTOS学习02】源码结构/数据类型/命名规则总结

    个人不是很喜欢FreeRTOS的编程风格,但是没办法,白嫖人家的东西,只能忍了,这里先简单总结一下: 相关文章 [FreeRTOS实战汇总]小白博主的RTOS学习实战快速进阶之路(持续更新) 文章目录 ...

  9. Altium Designer PCB封装bug,元件焊盘位置偏移解决方法

    1.问题描述:在拖动几个电阻位置时,意外发现Altium designer20版本软件的一个bug——0805的电阻两焊盘位置发生了偏移,如下图所示. 2.解决办法: ①选中焊盘偏移的封装,右键剪切掉 ...

  10. 图数据库 Nebula Graph 是什么

    图数据库(英语:Graph Database)是一个使用图结构进行语义查询的数据库.该系统的关键概念是图,形式上是点 (Node 或者 Vertex) 和边 (Edge 或者 Relationship ...