Java全栈开发---Java ERP系统开发:商业ERP(十五)ERP系统的权限验证框架Shiro

${shiro.ver}

org.apache.shiro

shiro-aspectj

${shiro.ver}

(2)配置web.xml,添加过滤器代理DelegatingFilterProxy,要放在struts2的核心过滤器之间

在这里插入图片描述

shiroFilter

org.springframework.web.filter.DelegatingFilterProxy

shiroFilter

*.action

*.html

*

(3)添加shiro核心控制器的spring配置文件
1)创建applicationContext_shiro.xml文件到erp_web的资源目录下

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns=“http://www.springframework.org/schema/beans”

xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd">

/error.html = anon

/login_*.action = anon

/login_*=anon

/*_list=perms[]

/dep_*=perms[“部门”]

/supplier.html=perms[“供应商管理”,“客户管理”]

/supplier_*=perms[“供应商管理”,“客户管理”]

/role.html=perms[“角色设置”]

/role_*=perms[“角色设置”,“角色菜单设置”]

/emp.html=perms[“员工”]

/emp_*=perms[“用户角色设置”,“重置密码”]

/goodstype.html=perms[“商品类型”]

/goodstype_*=perms[“商品类型”]

/goods.html=perms[“商品”]

/goods_*=perms[“商品”]

/store.html=perms[“仓库”]

/store_*=perms[“仓库”]

/dep.html=perms[“部门管理”]

/dep_*=perms[“部门管理”]

/orders.html=perms[“我的采购订单”,“采购订单申请”,“采购订单查询”,“采购订单审核”,“采购订单确认”,“采购订单入库”,“销售订单查询”,“销售订单录入”,“销售订单出库”]

/orders_*=perms[“我的采购订单”,“采购订单申请”,“采购订单查询”,“采购订单审核”,“采购订单确认”,“采购订单入库”,“销售订单查询”,“销售订单录入”,“销售订单出库”]

/report_order.html=perms[“销售统计报表”]

/report_*=perms[“销售统计报表”,“销售趋势报表”]

/report_trend.html=perms[“销售趋势报表”]

/*.html = authc

/*.action=authc

/*=authc

2)创建error.html

在这里插入图片描述

2、认证

(1)需求分析

判断当前用户是否登录,如果没有登录侧跳转到登录页面

(2)认证现实(重点)
1)Subject的login方法

修改LoginAction的checkUser方法

步骤:

创建令牌:UsernamePasswordToken

获取subject

执行subject.login()方法

在这里插入图片描述

public void checkUser() {

// 在登录的时候可能会发送异常

try {

/*

  • // 查询是否存在 Emp loginUser = empBiz.findByUsernameAndPwd(username, pwd);

  • System.out.println(loginUser+“emp”); if (loginUser != null) { // 记录当前登录的用户

  • ActionContext.getContext().getSession().put(“loginUser”, loginUser);//

  • 先把用户的信息放到session当中 ajaxReturn(true, “用户名或密码正确”); } else { ajaxReturn(false,

  • “用户名或密码不正确”); }

*/

// 1、创建令牌(通行证)身份认证,身份证明

UsernamePasswordToken upt = new UsernamePasswordToken(username, pwd);

// 2、获取主机subject:封装当前用户的操作

Subject subject = SecurityUtils.getSubject();

// 3、指向login

subject.login(upt);

ajaxReturn(true, “用户名或密码正确”);

} catch (Exception e) {

e.printStackTrace();

ajaxReturn(false, “登录失败”);

}

}

3、自定义Realm

我们改用subject.login方法后,并不会调用登陆的业务层进行登陆的验证查询,即不会从数据库查找登陆的用户名和密码是否正确,而是将这项工作交给 shiro去完成。

那 shiro,是怎么知道登陆的用户名和密码是否正确的呢?其实它也需要用到我的登陆验证业务,这时它就得向“别人”打听一下,那就是Realm了。

真正实现登陆验证的是Realm,而shiro只是去调Realm

Realm: Realm 充当了 Shiro与应用安全数据间的“桥梁"或者"连接器"。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的 Realm中查找用户及其权限信息。

从这个意义上讲,Realm实质上是一个安全相关的DAO:它封装了数据源的逐接细节,并在需要时将相关数据提供给 Shiro。当配置 Shiro,时,你必须至少指定一个 Realm,用于认证和或授权。

配置多个Realm 是可以的,但是至少需要一个。

1) 在erp_web子工程下创建包 com.itzheng.erp.realm:

在这里插入图片描述

2)创建ErpRealm类继承自AuthorizingRealm

在这里插入图片描述

在这里插入图片描述

package com.itzheng.erp.realm;

import org.apache.shiro.authc.AuthenticationException;

import org.apache.shiro.authc.AuthenticationInfo;

import org.apache.shiro.authc.AuthenticationToken;

import org.apache.shiro.authz.AuthorizationInfo;

import org.apache.shiro.realm.AuthorizingRealm;

import org.apache.shiro.subject.PrincipalCollection;

public class ErpRealm extends AuthorizingRealm {

/*

  • 授权

*/

@Override

protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {

System.out.println(“执行的授权的方法。。。”);

return null;

}

/*

  • 认证

  • return null;认证失败,返回AuthenticationInfo实现类,认证成功

*/

@Override

protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {

System.out.println(“执行的授权的方法。。。”);

return null;

}

}

3)修改applicationContext_shiro.xml

在这里插入图片描述

4)修改ErpRealm的doGetAuthenticationInfo方法

在这里插入图片描述

public class ErpRealm extends AuthorizingRealm {

private IEmpBiz empBiz;

/*

  • 授权

*/

public void setEmpBiz(IEmpBiz empBiz) {

this.empBiz = empBiz;

}

@Override

protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {

System.out.println(“执行的授权的方法。。。”);

return null;

}

/*

  • 认证 return null;认证失败,返回AuthenticationInfo实现类,认证成功

*/

@Override

protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {

System.out.println(“执行的授权的方法。。。”);

//通过令牌 用户名和密码?

UsernamePasswordToken upt = (UsernamePasswordToken) token;

//得到密码

String pwd = new String(upt.getPassword());

//调用登录查询

Emp emp = empBiz.findByUsernameAndPwd(upt.getUsername(), pwd);

if(null != emp) {

//构造参数1,主角=登录用户

//参数2:授权码

//参数3,realm的名称

SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(emp,pwd,getName());

return info;

}

return null;

}

}

5)修改applicationContext_shiro.xml

在这里插入图片描述

6)修改LoginAction,以及对应的配置文件

在这里插入图片描述

/*

  • 显示登录用户

*/

public void showName() {

// 获取当前登录的用户

//Emp emp = (Emp) ActionContext.getContext().getSession().get(“loginUser”);// 先把用户的信息放到session当中

// session是否会超时,用户是否登录过

//获取主题

Subject subject = SecurityUtils.getSubject();

//提取主角,拿到emp

Emp emp =(Emp)subject.getPrincipal();

System.out.println(emp);

if (null != emp) {

System.out.println(emp + “yyyy”);

ajaxReturn(true, emp.getName());

} else {

ajaxReturn(false, “”);

}

}

在这里插入图片描述

/*

  • 退出登录

*/

public void loginOut() {

// ActionContext.getContext().getSession().remove(“loginUser”);

SecurityUtils.getSubject().logout();

}

applicationContext_shiro.xml

在这里插入图片描述

7)修改BaseAction的getLoginUser方法

在这里插入图片描述

/*

  • 获取登录的用户信息

*/

public Emp getLoginUser() {

//Emp emp = (Emp) ActionContext.getContext().getSession().get(“loginUser”);

return (Emp) SecurityUtils.getSubject().getPrincipal();

}

4、授权(指定电脑的那些资源可以被访问)

(1)需求分析

授权就是通过设置规则,指定URL需要哪些授权才可以访问

在这里插入图片描述

(2)授权的实现

在这里插入图片描述

1)授权方法与配置(重点)
a、修改ErpRealm的doGetAuthorizationInfo方法

在这里插入图片描述

System.out.println(“执行了授权的方法…”);

SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();

// uuid=?怎么来

Emp emp = (Emp) principals.getPrimaryPrincipal();

// 获取当前登陆用户的菜单权限

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
orizationInfo();

// uuid=?怎么来

Emp emp = (Emp) principals.getPrimaryPrincipal();

// 获取当前登陆用户的菜单权限

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-PhnyHKqY-1715723709217)]

[外链图片转存中…(img-hV3Wm3l5-1715723709218)]

[外链图片转存中…(img-ma4Yyyaw-1715723709218)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 20
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值