shiro权限配置的细节问题&认证
2024-09-01 16:26:33
细节:
---[urls]部分配置,其格式是 url=拦截器【参数】 ,拦截器【参数】
---如果当前请求的 url 匹配 【urls】 部分或者某个url模式,将会执行配置的拦截器
---anon(anonymous)拦截器表示匿名访问(即不需要登陆验证)
---authc(authentication)拦截器的表示需要身份认证之后才能访问
<property name="filterChainDefinitions">
<value>
/login.jsp = anon
# everything else requires authentication:
/** = authc
</value>
</property>
/login.jsp = anon
# everything else requires authentication:
/** = authc
/user.jsp = anon
此时上面的会覆盖下面的user.jsp 无法访问
认证:
步骤:
1.获取当前subject,SecurityUtils.getSubject();
2.测试当前用户是否已经被认证,即是否已经登陆, currentUser.isAuthenticated()
3.若没有认证则/把用户名和密码封装为UsernamePasswordToken对象
-创建一个表单
-把请求提交到spriingmvc 的handler
-获取用户和密码
4.执行登陆 currentUser.login(token);
5.自定义Relam方法,从数据库中获取相应的记录,返回给Shiro
-实际上是需要集成org.apache.shiro.realm.AuthenticatingRealm
-实现doGetAuthenticationInfo()方法
6.有shiro完成对密码的比对
测试使用到的文件:
下面开始代码过程:
login.jsp页面的登陆标志代码:
login
<form action="shiro/login" method="post">
username:<input type="text" name="username">
password:<input type="password" name="password">
<input type="submit" value="submit">
</form>
在application中
<property name="filterChainDefinitions">
<value>
/login.jsp = anon
/shiro/login = anon
# everything else requires authentication:
/** = authc
</value>
</property>
ShiroHandler.java
@Controller
@RequestMapping("/shiro")
public class ShiroHandler {
@RequestMapping("/login")
public String login(@RequestParam("username")String username,@RequestParam("password") String password){ Subject currentUser = SecurityUtils.getSubject();
if (!currentUser.isAuthenticated()) {
//把用户名和密码封装为UsernamePasswordToken对象
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
token.setRememberMe(true);
try {
//执行登陆
currentUser.login(token);
}catch (AuthenticationException ae) {
System.out.println("登陆失败" + ae.getMessage());
}
} 成功之后做重定向
return "redirect:/list.jsp";
}
}
在applicationContext中需要扫描这个类的包
ShiroRealm.java
做登陆验证实现下面的接口即可
doGetAuthenticationInfo(AuthenticationToken arg0)的arg0是指就是UsernamePasswordToken token = new UsernamePasswordToken(username, password);
public class ShiroRealm extends AuthenticatingRealm { @Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0) throws AuthenticationException {
System.out.println("doGetAuthenticationInfo" + arg0); //1.把AuthenticationToken转为UsernamePasswordToken
UsernamePasswordToken upToken = (UsernamePasswordToken) arg0; //2.从UsernamePasswordToken获取username
String username = upToken.getUsername(); //3.调用数据库的方法,从数据库查询username对应的用户记录
System.out.println("从数据库中获取username:" + username); //4.若用户不存在可以抛出异常 UnKnownAccountException异常
if("unknow".equals(username)){
throw new UnknownAccountException("username 不存在");
}
//5.根据用户信息的清空决定是否需要抛出其他的异常
if("monster".equals(username)){
throw new LockedAccountException("用户被锁定");
}
//6.根据用户的情况来构建AuthenticationInfo并且返回
//以下信息是从数据库中获取的
//principal:认证的实体信息,可以是username,也可以是数据表对应的实体对象
Object principal = username;
//credentials:密码
Object credentials = "";
//realmName:当前realm对象为name,调用父类的getName()方法即可
String realmName = getName();
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(principal, credentials, realmName); return info;
}
}
当我们输入密码为1234,以及其他为username(除了上图的两个)
此时我们就有权限对其他的页面进行测试
出错之后的异常还是会打印的
此时我们需要登出的操作
list.jsp
<body>
list. <a href="shiro/logout">Logout</a>
</body>
在applicationContext.xml文件中:
<!--
配置那些页面需要受保护,以及访问这些页面需要的的权限 )anon 可以被匿名访问
)authc 必须认证即登陆后才可以访问的页面
3).logout登出
-->
<property name="filterChainDefinitions">
<value>
/login.jsp = anon
/shiro/login = anon
/shiro/logout = logout # everything else requires authentication:
/** = authc
</value>
</property>
但我们点击这个超链接的 时候就会立马退出来到login.jsp页面中
最新文章
- http://www.cnblogs.com/zhaoyang/archive/2012/01/07/2315436.html
- ASP.net MVC3 报错";未找到视图“Index”或其母版视图,或没有视图引擎支持搜索的位置 ";的解决方法
- vs2010开发android的准备工作
- cxf 报错:java.lang.NoSuchMethodError: org.apache.ws.commons.schema.XmlSchemaCollection.read(Lorg/w3c/dom/Document;Ljava/lang/String;)
- js/j&#39;query相互转换操作指南
- 设计模式 -->; (13)备忘录模式
- Java遍历时删除List、Set、Map中的元素(源码分析)
- maven pom.xml 里scope的作用
- 【.NET Core项目实战-统一认证平台】第十章 授权篇-客户端授权
- SNMP 优秀帖子
- (void) (&;_min1 == &;_min2);【转】
- ThinkPHP框架 AJAX方法返回 AJAX实现分页例子:
- C++学习(二十五)(C语言部分)之 结构体2
- python一些东西
- httpClient 深入浅出~
- 软件架构设计学习总结(15):远程通信(RPC,Webservice,RMI,JMS、EJB、JNDI的区别)对比
- Javascript 匿名函数与闭包
- GIT回推本地commit近期版本
- Windows下搭建elasticsearch集群案例
- mysql 分片