/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();
// 获取当前登陆用户的菜单权限
List
b、配置权限名称:修改applicationContext_shiro.xml
/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[“商品”]
/orders.html=perms[“我的采购订单”,“采购订单申请”,“采购订单查询”,“采购订单审核”,“采购订单确认”,“采购订单入库”,“销售订单查询”,“销售订单录入”,“销售订单出库”]
/orders_*=perms[“我的采购订单”,“采购订单申请”,“采购订单查询”,“采购订单审核”,“采购订单确认”,“采购订单入库”,“销售订单查询”,“销售订单录入”,“销售订单出库”]
/report_order.html=perms[“销售统计报表”]
/report_*=perms[“销售统计报表”,“销售趋势报表”]
/report_trend.html=perms[“销售趋势报表”]
/*.html = authc
/*.action=authc
/*=authc
2)
3)小结:
授权方法的作用:告诉shiro当前用户有什么权限
配置信息的作用:告诉shiro什么资源有什么权限才可以被访问
5、自定义授权过滤器
(1)创建filter包以及ErpAuthorizationFilter类继承AuthorizationFilter
package com.itzheng.erp.filter;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authz.AuthorizationFilter;
/**
-
自定义授权过滤器
*/
public class ErpAuthorizationFilter extends AuthorizationFilter {
@Override
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue)
throws Exception {
// 获取主题
Subject subject = getSubject(request, response);
/// orders.html=perms[“采购订单的查询”,“采购订单的审核”,“采购订单的确认”,“采购订单的入库”]
// mappedValue=“采购订单的查询”,“采购订单的审核”,“采购订单的确认”,“采购订单的入库”
String[] perms = (String[]) mappedValue;
boolean isPermitted = true;
if (null == perms || perms.length == 0) {
return isPermitted;
}
if (perms != null && perms.length > 0) {
/*
-
原有的代码 if (perms.length == 1) { if (!subject.isPermitted(perms[0])) {
-
isPermitted = false; } } else { if (!subject.isPermittedAll(perms)) {
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
总结
机会是留给有准备的人,大家在求职之前应该要明确自己的态度,熟悉求职流程,做好充分的准备,把一些可预见的事情做好。
对于应届毕业生来说,校招更适合你们,因为绝大部分都不会有工作经验,企业也不会有工作经验的需求。同时,你也不需要伪造高大上的实战经验,以此让自己的简历能够脱颖而出,反倒会让面试官有所怀疑。
你在大学时期应该明确自己的发展方向,如果你在大一就确定你以后想成为Java工程师,那就不要花太多的时间去学习其他的技术语言,高数之类的,不如好好想着如何夯实Java基础。下图涵盖了应届生乃至转行过来的小白要学习的Java内容:
请转发本文支持一下
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!**
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-DhtIfgIO-1712851160272)]
总结
机会是留给有准备的人,大家在求职之前应该要明确自己的态度,熟悉求职流程,做好充分的准备,把一些可预见的事情做好。
对于应届毕业生来说,校招更适合你们,因为绝大部分都不会有工作经验,企业也不会有工作经验的需求。同时,你也不需要伪造高大上的实战经验,以此让自己的简历能够脱颖而出,反倒会让面试官有所怀疑。
你在大学时期应该明确自己的发展方向,如果你在大一就确定你以后想成为Java工程师,那就不要花太多的时间去学习其他的技术语言,高数之类的,不如好好想着如何夯实Java基础。下图涵盖了应届生乃至转行过来的小白要学习的Java内容:
请转发本文支持一下
[外链图片转存中…(img-BF5gxKJ4-1712851160273)]
[外链图片转存中…(img-gSjaKz6V-1712851160273)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-PNWmZoQ2-1712851160273)]