授权:
需求描述:
1、指定角色:
AdminController只有具有admin角色(tom)才能访问;
GuestController只有具有guest角色(cat)才能访问;
2、指定权限:
PermissionController只有具有create权限(tom和cat)的用户才能访问;
涉及知识点:
1、在spring-shiro.xml中进行授权验证
2、注解方式授权验证
3、jsp中授权验证
4、多级路由匹配规则
正式开始:
1、AdminController.java
@Controller @RequestMapping("/admin") public class AdminController { /** * * @param user * @param request * @return */ @RequestMapping("/test") public String adminTest() { //Subject subject = SecurityUtils.getSubject(); //if(subject.hasRole("admin")) { return "admin"; //}else { // return "login"; //} } }
这个授权验证写在spring-shiro.xml中:/admin/**=authc,roles[admin]
,这样就表示要有admin这个角色的用户才能访问。同时这个也是双重路由,/admin/**
就表示拦截admin开头的路由。
2、GuestController.java
public class GuestController { @RequiresRoles("guest") @RequestMapping("/guest") public String guestTest() { return "guest"; } }
这个是使用注解方式进行权限验证的,@RequiresRoles("guest")
就表示要有guest这个角色才能访问这个路由。
3、PermissionsController.java
@Controller public class PermissionsController { /** * * @param user * @param request * @return */ @RequestMapping("/permissions") public String permissionTest(){ Subject subject = SecurityUtils.getSubject(); if(subject.isPermitted("create")) { return "permission"; }else { return "login"; } } }
这个是直接在Controller中获取到登录用户,然后用Subject对象的isPermitted方法就行判断。subject.isPermitted("create")
用来判断登录的用户是否有create权限,有就true,没有就是false。
4、接下来看看前端页面:
①success.jsp
登录成功跳转到这个页面
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> 欢迎你! <br> <a href="http://localhost:8080/shiroweb/admin/test">有admin角色才能访问</a> <br> <a href="http://localhost:8080/shiroweb/permissions">有create权限就可以访问</a><br> <a href="http://localhost:8080/shiroweb/guest">guest才能访问</a> </body> </html>
这里定义了三个链接,分别指向上面那三个controller。
②admin.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> 欢迎有admin角色的你! </body> </html>
③guest.jsp
pageEncoding="utf-8"%> <%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Insert title here</title> </head> <body> <shiro:hasRole name="guest"> 欢迎guest!(只有guest角色登录进来才能显示这段话)<shiro:principal/> </shiro:hasRole> <shiro:hasRole name="admin"> 欢迎admin!(只有admin角色登录进来才能显示这段话)<shiro:principal/> </shiro:hasRole> </body> </html>
这里就用到了jsp标签形式判断角色,<shiro:hasRole name="#">xxx</shiro:hasRole>
就是用来判断当前用户有没有#角色,有#角色才会显示xxx内容。
注意:使用shiro的jsp标签要在jsp页面中添加
<%@taglibprefix="shiro"uri="http://shiro.apache.org/tags"%>
④permission.jsp
pageEncoding="UTF-8"%> <%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> 欢迎有你! <shiro:hasPermission name="delete"> 只有拥有delete权限的人登录进来才能显示这段话.<shiro:principal/> </shiro:hasPermission> </body> </html>
这里用到了<shiro:hasPermissionname="#">xxx</shiro:hasPermission>
来判断权限,只有具有#权限的用户才会显示xxx内容。
⑤unauthor.jsp
pageEncoding="utf-8"%> <%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Insert title here</title> </head> <body> 对不起,你没有操作权限! <a href="login.jsp">点此登录</a> </body> </html>
权限认证失败时跳转到此页面,因为在spring-shiro.xml中配置过。
四、项目测试
1、用tom登录
分析:tom具有admin角色和所有权限,所以success.jsp页面的前两个链接可以访问,且permission.jsp的<shiro:hasPermission name="delete">
标签里面的话会显示。
第三个链接不能访问,会抛出异常,因为需要guest角色才能访问。
结果:
2、用cat登录
分析:cat具有guest角色和create 以及query权限,所以success.jsp的第一个链接不能访问,会跳转到unauthor.jsp,第二个链接可以访问,但是不能显示
<shiro:hasPermission name="delete">
标签里面的话,第三个链接可以访问,且能显示<shiro:hasRole name="guest">
里面的话。
结果:
所有结果符合预期,测试通过!
五、知识点补充
1、url匹配规则:
/admin?=authc
表示admin1需要认证,admin2也需要,但是admin不一定,因为问号表示单个字符
/admin*=authc
表示admin1需要认证,admin21需要,admin也需要,*号表示一个或多个字符
/admin/**=authc
可以匹配多路径,比如admin/a/b
2、
Subject对象除了isPermitted("#")判断是否拥有#权限,还有hasRole("#")判断是否有#角色,hasRoles(Arrays.asList("role1","role2"))来判断是否有role1和role2角色。
3、其他注释:
@RequiresAuthentication
表示要验证通过才能被访问
@RequiresGuest
表示之前session中没有被验证过才能访问
@RequiresPermissions("create")
表示有create权限才能访问
@RequiresRoles("admin")
只有admin这个角色才能访问
@RequiresUser
指定用户才能访问
总结:
shiro提供了认证登录,授权,密码加密等功能,方便易用。授权可以在spring-shiro中定义过滤链,可以使用注释,也可以在controller 方法中用Subject对象的方法判断,还可以在jsp中使用标签。
以上内容是个人学习笔记整理,如有错误,欢迎批评指正!