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
<