【1.4】案例
【1.4.1】创建项目
拷贝shiro-day01-07web新建shiro-day01-08web-java
【1.4.2】修改shiro.ini
#声明自定义的realm,且为安全管理器指定realms
[main]
definitionRealm=com.itheima.shiro.realm.DefinitionRealm
securityManager.realms=$definitionRealm
#用户退出后跳转指定JSP页面
logout.redirectUrl=/login.jsp
#若没有登录,则被authc过滤器重定向到login.jsp页面
authc.loginUrl = /login.jsp
[urls]
/login=anon
#发送/home请求需要先登录
#/home= authc
#发送/order/list请求需要先登录
#/order-list = roles[admin]
#提交代码需要order:add权限
#/order-add = perms["order:add"]
#更新代码需要order:del权限
#/order-del = perms["order:del"]
#发送退出请求则用退出过滤器
/logout = logout
【1.4.3】登录相关
修改HomeServlet的doPost方法
1. package com.itheima.shiro.web; 2. 3. import org.apache.shiro.SecurityUtils; 4. import org.apache.shiro.subject.Subject; 5. 6. import javax.servlet.ServletException; 7. import javax.servlet.annotation.WebServlet; 8. import javax.servlet.http.HttpServlet; 9. import javax.servlet.http.HttpServletRequest; 10. import javax.servlet.http.HttpServletResponse; 11. import java.io.IOException; 12. 13. /** 14. * @Description:系统home页面 15. */ 16. @WebServlet(urlPatterns = "/home") 17. public class HomeServlet extends HttpServlet { 18. 19. @Override 20. protected void doGet(HttpServletRequest req, HttpServletResponse resp) 21. throws ServletException, IOException { 22. doPost(req, resp); 23. } 24. 25. @Override 26. protected void doPost(HttpServletRequest req, HttpServletResponse resp) 27. throws ServletException, IOException { 28. //通过subjectd对象去判断是否登录 29. Subject subject = SecurityUtils.getSubject(); 30. boolean flag = subject.isAuthenticated(); 31. if (flag){ 32. resp.sendRedirect("home.jsp"); 33. }else { 34. req.getRequestDispatcher("/login").forward(req, resp); 35. } 36. } 37. }
访问http://localhost:8080/platform/home 进行debug
此时我们通过subject.isAuthenticated()判断是否登录,如果登录则重定向到home.jsp,如果没有登录则转发到/login对应的servlet
【1.4.4】角色相关
修改OrderListServlet的doPost方法,判断是否有admin角色,如果有则转发order-list.jsp,没有则转发/login
1. package com.itheima.shiro.web; 2. 3. import org.apache.shiro.SecurityUtils; 4. import org.apache.shiro.subject.Subject; 5. 6. import javax.servlet.ServletException; 7. import javax.servlet.annotation.WebServlet; 8. import javax.servlet.http.HttpServlet; 9. import javax.servlet.http.HttpServletRequest; 10. import javax.servlet.http.HttpServletResponse; 11. import java.io.IOException; 12. 13. /** 14. * @Description:订单列表 15. */ 16. @WebServlet(urlPatterns = "/order-list") 17. public class OrderListServlet extends HttpServlet { 18. 19. @Override 20. protected void doGet(HttpServletRequest req, HttpServletResponse resp) 21. throws ServletException, IOException { 22. doPost(req, resp); 23. } 24. 25. @Override 26. protected void doPost(HttpServletRequest req, HttpServletResponse resp) 27. throws ServletException, IOException { 28. Subject subject = SecurityUtils.getSubject(); 29. //判断当前角色 30. boolean flag = subject.hasRole("admin"); 31. if (flag){ 32. req.getRequestDispatcher("order-list.jsp").forward(req, resp); 33. }else { 34. req.getRequestDispatcher("/login").forward(req, resp); 35. } 36. } 37. }
访问http://localhost:8080/platform/order-list
因为此时我未登录,也就是说当前没有admin角色,这是通过subject.hasRole("admin")返回未false
【1.4.5】资源相关
修改OrderAddServlet
1. package com.itheima.shiro.web; 2. 3. import org.apache.shiro.SecurityUtils; 4. import org.apache.shiro.subject.Subject; 5. 6. import javax.servlet.ServletException; 7. import javax.servlet.annotation.WebServlet; 8. import javax.servlet.http.HttpServlet; 9. import javax.servlet.http.HttpServletRequest; 10. import javax.servlet.http.HttpServletResponse; 11. import java.io.IOException; 12. 13. /** 14. * @Description:添加页码 15. */ 16. @WebServlet(urlPatterns = "/order-add") 17. public class OrderAddServlet extends HttpServlet { 18. 19. @Override 20. protected void doGet(HttpServletRequest req, HttpServletResponse resp) 21. throws ServletException, IOException { 22. doPost(req, resp); 23. } 24. 25. @Override 26. protected void doPost(HttpServletRequest req, HttpServletResponse resp) 27. throws ServletException, IOException { 28. Subject subject = SecurityUtils.getSubject(); 29. //判断是否有对应资源 30. boolean flag = subject.isPermitted("order:add"); 31. if (flag){ 32. req.getRequestDispatcher("order-add.jsp").forward(req, resp); 33. }else { 34. req.getRequestDispatcher("/login").forward(req, resp); 35. } 36. } 37. 38. }
访问http://localhost:8080/platform/order-add
因为此时我未登录,也就是说当前没有order:add资源,通过 subject.isPermitted("order:add")返回未false
【2】基于Jsp标签
【2.1】使用方式
Shiro提供了一套JSP标签库来实现页面级的授权控制, 在使用Shiro标签库前,首先需要在JSP引入shiro标签:
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
【2.2】相关标签
标签 | 说明 |
< shiro:guest > | 验证当前用户是否为“访客”,即未认证(包含未记住)的用户 |
< shiro:user > | 认证通过或已记住的用户 |
< shiro:authenticated > | 已认证通过的用户。不包含已记住的用户,这是与user标签的区别所在 |
< shiro:notAuthenticated > | 未认证通过用户。与guest标签的区别是,该标签包含已记住用户 |
< shiro:principal /> | 输出当前用户信息,通常为登录帐号信息 |
< shiro:hasRole name="角色"> | 验证当前用户是否属于该角色 |
< shiro:lacksRole name="角色"> | 与hasRole标签逻辑相反,当用户不属于该角色时验证通过 |
< shiro:hasAnyRoles name="a,b"> | 验证当前用户是否属于以下任意一个角色 |
<shiro:hasPermission name=“资源”> | 验证当前用户是否拥有制定权限 |
<shiro:lacksPermission name="资源"> | 与permission标签逻辑相反,当前用户没有制定权限时,验证通过 |
【2.3】案例
【2.3.1】新建项目
拷贝shiro-day01-08web-java新建shiro-day01-09web-jsp-taglib项目
【2.3.2】修改home.jsp
1. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 2. <%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %> 3. <%@ page contentType="text/html;charset=UTF-8" language="java" %> 4. <html> 5. <head> 6. <title></title> 7. </head> 8. <body> 9. <h6> 10. <a href="${pageContext.request.contextPath}/logout">退出</a> 11. <shiro:hasRole name="admin"> 12. <a href="${pageContext.request.contextPath}/order-list">列表</a> 13. </shiro:hasRole> 14. <shiro:hasPermission name="order:add"> 15. <a href="${pageContext.request.contextPath}/order-add">添加</a> 16. </shiro:hasPermission> 17. </h6> 18. </body> 19. </html>
【2.3.3】测试
访问http://localhost:8080/platform/login
使用admin/123登录
这个时候我们只能看见“列表”,看不见“添加”,点击“退出”
使用jay/123登录
这个时候我们只能看见“添加”,看不见“列表”,点击“退出”
需要注意的是,这里只是页面是否显示内容,不能防止盗链的发生