《一头扎进Shiro》第05讲

素颜马尾好姑娘i 2022-06-02 03:18 223阅读 0赞

内容:
shiro集成web
(1)简单跳转的讨论
(2)用户身份角色验证
(3)用户身份权限验证


步骤1 基础配置

pom.xml配置

  1. <dependency>
  2. <groupId>javax.servlet</groupId>
  3. <artifactId>servlet-api</artifactId>
  4. <version>2.5</version>
  5. <scope>provided</scope>
  6. </dependency>
  7. <dependency>
  8. <groupId>javax.servlet.jsp</groupId>
  9. <artifactId>jsp-api</artifactId>
  10. <version>2.2</version>
  11. <scope>provided</scope>
  12. </dependency>
  13. <dependency>
  14. <groupId>javax.servlet</groupId>
  15. <artifactId>jstl</artifactId>
  16. <version>1.2</version>
  17. </dependency>
  18. <dependency>
  19. <groupId>log4j</groupId>
  20. <artifactId>log4j</artifactId>
  21. <version>1.2.17</version>
  22. </dependency>
  23. <dependency>
  24. <groupId>commons-logging</groupId>
  25. <artifactId>commons-logging</artifactId>
  26. <version>1.2</version>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.apache.shiro</groupId>
  30. <artifactId>shiro-core</artifactId>
  31. <version>1.4.0</version>
  32. </dependency>
  33. <dependency>
  34. <groupId>org.slf4j</groupId>
  35. <artifactId>slf4j-api</artifactId>
  36. <version>1.7.25</version>
  37. </dependency>
  38. <dependency>
  39. <groupId>org.apache.shiro</groupId>
  40. <artifactId>shiro-web</artifactId>
  41. <version>1.4.0</version>
  42. </dependency>

web.xml配置

  1. <listener>
  2. <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
  3. </listener>
  4. <filter>
  5. <filter-name>ShiroFilter</filter-name>
  6. <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
  7. </filter>
  8. <filter-mapping>
  9. <filter-name>ShiroFilter</filter-name>
  10. <url-pattern>/*</url-pattern>
  11. </filter-mapping>
  12. <servlet>
  13. <servlet-name>loginServlet</servlet-name>
  14. <servlet-class>com.java1234.login.LoginServlet</servlet-class>
  15. </servlet>
  16. <servlet-mapping>
  17. <servlet-name>loginServlet</servlet-name>
  18. <url-pattern>/login</url-pattern>
  19. </servlet-mapping>

shiro.ini配置文件

  1. [main]
  2. authc.loginUrl=/login
  3. roles.unauthorizedUrl=/unauthorized.jsp
  4. perms.unauthorizedUrl=/unauthorized.jsp
  5. [users]
  6. java1234=123456,admin
  7. jack=123,teacher
  8. marry=234
  9. json=345
  10. [roles]
  11. admin=user:*
  12. teacher=student:*
  13. [urls]
  14. /login=anon
  15. /admin=authc
  16. /student=roles[teacher]
  17. /teacher=perms["user:create"]

LoginServlet .java

  1. package com.java1234.login;
  2. import java.io.IOException;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import org.apache.shiro.SecurityUtils;
  8. import org.apache.shiro.authc.AuthenticationException;
  9. import org.apache.shiro.authc.IncorrectCredentialsException;
  10. import org.apache.shiro.authc.UnknownAccountException;
  11. import org.apache.shiro.authc.UsernamePasswordToken;
  12. import org.apache.shiro.subject.Subject;
  13. public class LoginServlet extends HttpServlet{
  14. //doGet 请求时展示登录页面
  15. @Override
  16. protected void doGet(HttpServletRequest req, HttpServletResponse resp)
  17. throws ServletException, IOException {
  18. System.out.println("login doGet()方法执行了");
  19. req.getRequestDispatcher("login.jsp").forward(req, resp);
  20. }
  21. //doPost 时进行登录,登录时收集 username/password 参数,然后提交给 Subject 进行登录。
  22. //如果有错误再返回到登录页面;否则跳转到登录成功页面
  23. @Override
  24. protected void doPost(HttpServletRequest req, HttpServletResponse resp)
  25. throws ServletException, IOException {
  26. System.out.println("login dopost");
  27. String userName=req.getParameter("username");
  28. String password=req.getParameter("password");
  29. Subject subject=SecurityUtils.getSubject();
  30. UsernamePasswordToken token=new UsernamePasswordToken(userName, password);
  31. try{
  32. subject.login(token);
  33. resp.sendRedirect("success.jsp");
  34. }catch(Exception e){
  35. e.printStackTrace();
  36. req.setAttribute("errorInfo", "用户名或者密码错误");
  37. req.getRequestDispatcher("login.jsp").forward(req, resp);
  38. }
  39. }
  40. }

AdminServlet.java

  1. package com.java1234.login;
  2. import java.io.IOException;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. public class AdminServlet extends HttpServlet{
  8. //doGet 请求时展示登录页面
  9. @Override
  10. protected void doGet(HttpServletRequest req, HttpServletResponse resp)
  11. throws ServletException, IOException {
  12. System.out.println("admin do get");
  13. }
  14. @Override
  15. protected void doPost(HttpServletRequest req, HttpServletResponse resp)
  16. throws ServletException, IOException {
  17. System.out.println("admin do post");
  18. }
  19. }

login.jsp

  1. <body>
  2. <form action="login" method="post">
  3. 姓名:<input type="text" name="username"><br>
  4. 密码:<input type="password" name="password"><br>
  5. <input type="submit" value="登录">
  6. </form>
  7. </body>

success.jsp

  1. <body>
  2. 欢迎你
  3. </body>

unauthorized.jsp

  1. <body>
  2. 身份验证未通过或者权限不足。
  3. </body>

测试项目
(1)测试链接跳转
打开浏览器在地址栏里面输入:
http://127.0.0.1:8080/shiro06/admin,会自动跳转到登录界面
这里写图片描述

authc.loginUrl=/login 默认是/login.jsp;
anon拦截器表示匿名访问(即不需要登录即可访问);
authc 拦截器表示需要身份认证通过后才能访问;
也就是说如果设置成authc 那么就要登录才能访问,否则直接跳转到默认页面(登录页面)。


(2) 测试 角色和权限

首先用java1234=123456,admin登录
然后打开浏览器在地址栏里面输入:
http://127.0.0.1:8080/shiro06/student,会跳转到unauthorized.jsp界面 显示角色或者权限不足,

这里写图片描述

原因在于java1234用户的没有/student=roles[teacher] url所指定的角色,所以登陆之后想要跳转到/student链接,权限不足。
然而Jack用户就可以跳转到该链接。

同理 拥有user的create权限的用户登陆以后就可以跳转到/teacher链接 比如admin。

发表评论

表情:
评论列表 (有 0 条评论,223人围观)

还没有评论,来说两句吧...

相关阅读

    相关 一头设计模式-模版模式

    定义:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情冴下,重新定义算法中的某些步骤。 用自己的话:把算法的步骤,困难的实现

    相关 一头算法导论-冒泡排序

    定义:交换排序的基本思想是,通过比较两个记录键值的大小,如果这两个记录键值的大小出现逆序,则交换这两个记录,这样将键值较小的记录向序列前部移动,键值较大的记录向序列后部移动。假