【Shiro】Shiro从小白到大神(四)-集成Web

网友投稿 1039 2022-05-30

本节讲集成Web(没有通过数据库-通过text)

实现登录经过Shiro验证后跳转另外的页面,以及没验证通过进行的权限拦截

shiro.ini文件配置

[main] authc.loginUrl=/login ;这里的配置为authc验证没通过请求的路径 loginUrl为一个属性名 org.apache.shiro.web.filter.authc.FormAuthenticationFilter类中 roles.unauthorizedUrl=unauthorized.jsp ;roles 角色认证未通过去请求的Url 在org.apache.shiro.web.filter.authz.AuthorizationFilter可以看到unauthorizedUrl这个属性 perms.unauthorizedUrl=unauthorized.jsp ;权限认证未通过 [users] chx=123,admin jack=123,teacher marry=123 json=123 [roles] admin=user:* teacher=student:* [urls] /login=anon ;请求login需要的权限,只要游客就行,或者不进行验证 anon /admin=authc ;会进行身份验证 authc 对应的是过滤器 ;权限拦截是有顺序的,需要先进行身份验证,也就是登录后才有权限角色等认证 /student=roles[teacher] ;请求student url 必须拥有roles的teacher角色登录 /teacher=perms["user:create"] ;必须要有teacher的user:create操作才能访问teacher这个url

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

ShiroUtils工具类:

package cn.chenhaoxiang.common; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.config.IniSecurityManagerFactory; import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.subject.Subject; import org.apache.shiro.util.Factory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ShiroUtils { private static Logger logger = LoggerFactory.getLogger(ShiroUtils.class); /** * 封装Subject * @param configFile 配置文件 * @param userName 用户名 * @param password 密码 * @return */ public static Subject login(String configFile, String userName, String password){ //IniSecurityManagerFactory方法在1.4.0中被注解标志为不建议使用 //读取配置文件,初始化SecurityManager工厂 Factory factory = new IniSecurityManagerFactory(configFile); //获取securityManager 实例 SecurityManager securityManager=factory.getInstance(); //把securityManager实例绑定到SecurityUtils SecurityUtils.setSecurityManager(securityManager); //得到当前执行的用户 Subject subject = SecurityUtils.getSubject();//认证实体,当前进来的用户 //创建token令牌,用户名/密码 UsernamePasswordToken token = new UsernamePasswordToken(userName,password); //身份认证 try { subject.login(token); logger.info("登录成功!"); } catch (AuthenticationException e) { logger.info("登录失败!"); e.printStackTrace(); } return subject; } }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

pom.xml配置

4.0.0 cn.chenhaoxiang ShiroWeb 1.0-SNAPSHOT org.apache.shiro shiro-core 1.3.2 org.apache.shiro shiro-web 1.2.5 org.slf4j slf4j-log4j12 1.7.25 log4j log4j 1.2.17 commons-logging commons-logging 1.2 junit junit 4.12 javax.servlet javax.servlet-api 3.1.0 javax.servlet jstl 1.2

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

【Shiro】Shiro从小白到大神(四)-集成Web

50

51

52

53

54

55

56

57

58

web.xml配置

ShiroWeb index.jsp org.apache.shiro.web.env.EnvironmentLoaderListener ShiroFilter org.apache.shiro.web.servlet.ShiroFilter configPath /WEB-INF/shiro.ini ShiroFilter /* loginServlet cn.chenhaoxiang.servlet.LoginServlet adminServlet cn.chenhaoxiang.servlet.AdminServlet loginServlet /login adminServlet /admin

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

代码核心就这些了,其他的代码可以下载源码自己运行学习。

进行测试的话,直接在浏览器中输入想访问的链接就行,你可以看控制台输出的运行结果,以及页面的跳转。

官网学习文档链接:http://shiro.apache.org/web.html#Web-Shiro1.2andlater

Url匹配方式(urls)

? 匹配一个字符,例如 /admin? 可以匹配/admin1;/admin2等等,但是不能匹配/admin12;/admin,也就是不能匹配多个字符或者多路径,而且必须匹配一个字符 * 匹配零个或者一个或者多个字符,例如 /admin* 可以匹配 /admin;/admin1;/admin12;等等但是不能匹配/admin/a,也就是不能匹配多路径,只能在一个路径下 ** 匹配零个或者多个路径,例如 /admin/**,可以匹配/admin;/admin/a;/admin/a/b,不能匹配/admin12,因为是匹配多路径的,而不是多字符

1

2

3

可以自己配合urls下的/admin来测试

可以自己同时结合几个匹配方式来测试,例如/admin*/**

注意: /admin**和/admin/**是一样的

Shiro标签

结合实例来理解shiro标签

shiro:hasRole

注意jsp先引入:

<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>

1

jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %> Title 登录成功,欢迎你 欢迎有admin角色的用户

1

2

3

4

5

6

7

8

9

10

11

12

13

这样,你登录之后,如果有admin角色,就会显示里面的那句话了

登录admin角色的用户

shiro:hasPermission标签

欢迎有student:create权限的用户

1

2

3

如果拥有student:create权限,就会显示标签内文字

shiro:principal标签

显示用户信息的标签

1

Shiro会话机制

Shiro有自己的一套会话机制,不多讲,其实正常开发的话,一般都是用默认的

//获取Session Shiro管理的Session Session session = subject.getSession(); System.out.println("sessionId:"+session.getId());//用户会话的唯一id System.out.println("sessionHost:"+session.getHost());//获取主机地址 System.out.println("sessionTimeOut:"+session.getTimeout());//获取超时时间,默认是半小时的,单位ms session.setAttribute("info","session数据");

1

2

3

4

5

6

7

要深入研究的话,可以去官网看看哦: http://shiro.apache.org/web.html#Web-sessionManagement

源代码-:

本文章由[谙忆]编写, 所有权利保留。

欢迎转载,分享是进步的源泉。

转载请注明出处:

http://chenhaoxiang.cn

本文源自【谙忆的博客】

web前端

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:openharmony移植案例与原理 - startup子系统之syspara_lite系统属性部件(1)
下一篇:【愚公系列】手把手教你用搭一个WeLink上的出差应用丨【AppCube X WeLink双剑合璧】
相关文章