springboot整合shiro

贾琏
• 阅读 170

一、shiro简介
Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码学和会话管理。相比较Spring Security,shiro有小巧、简单、易上手等的优点。所以很多框架都在使用shiro。Shiro包含了三个核心组件:Subject, SecurityManager 和 Realms。
1.Subject代表了当前用户的安全操作。
2.SecurityManager则管理所有用户的安全操作。它是Shiro框架的核心,典型的Facade模式,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。
3.Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息

二、springboot整合shiro

1.使用maven创建一个jar项目,在pom.xml文件中添加依赖

[XML] _纯文本查看_ _复制代码_

?

01

02

03

04

05

06

07

08

09

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

<`properties`>

<`project.build.sourceEncoding>UTF-8</project.build.sourceEncoding`>

<`java.version>1.8</java.version`>

</`properties`>

<`parent`>

<`groupId>org.springframework.boot</groupId`>

<`artifactId>spring-boot-starter-parent</artifactId`>

<`version>1.3.5.RELEASE</version`>

<`relativePath/><!-- lookup parent from repository -->`

</`parent`>

<`dependencies`>

<`dependency`>

<`groupId>org.springframework.boot</groupId`>

<`artifactId>spring-boot-starter-web</artifactId`>

</`dependency`>

<`dependency`>

<`groupId>org.springframework.boot</groupId`>

<`artifactId>spring-boot-starter-test</artifactId`>

<`scope>test</scope`>

</`dependency`>

<`dependency`>

<`groupId>commons-logging</groupId`>

<`artifactId>commons-logging</artifactId`>

<`version>1.1.3</version`>

</`dependency`>

<`dependency`>

<`groupId>org.apache.shiro</groupId`>

<`artifactId>shiro-core</artifactId`>

<`version>1.2.2</version`>

</`dependency`>

<`dependency`>

<`groupId>mysql</groupId`>

<`artifactId>mysql-connector-java</artifactId`>

<`version>5.1.25</version`>

</`dependency`>

<`dependency`>

<`groupId>com.alibaba</groupId`>

<`artifactId>druid</artifactId`>

<`version>0.2.23</version`>

</`dependency`>

<!-- shiro权限控制框架 -->

<`dependency`>

<`groupId>org.apache.shiro</groupId`>

<`artifactId>shiro-spring</artifactId`>

<`version>1.3.2</version`>

</`dependency`>

</`dependencies`>

2.编写MyShiroRealm类,实现AuthorizingRealm接口

[Java] _纯文本查看_ _复制代码_

?

01

02

03

04

05

06

07

08

09

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

50

51

52

53

54

public`classMyShiroRealmextends`AuthorizingRealm {

/**

* 授权用户权限

*/

@Override

protected`AuthorizationInfo doGetAuthorizationInfo(`

PrincipalCollection principals) {

//获取用户

User user = (User)SecurityUtils.getSubject().getPrincipal();

SimpleAuthorizationInfo info = `new`SimpleAuthorizationInfo();

//获取用户角色

Set<String> roleSet =`new`HashSet<String>();

roleSet.add(`"100002"`);

info.setRoles(roleSet);

//获取用户权限

Set<String> permissionSet =`new`HashSet<String>();

permissionSet.add(`"权限添加"`);

permissionSet.add(`"权限删除"`);

info.setStringPermissions(permissionSet);

return`info;`

}

/**

* 验证用户身份

*/

@Override

protected`AuthenticationInfo doGetAuthenticationInfo(`

AuthenticationToken authcToken)`throws`AuthenticationException {

UsernamePasswordToken token = (UsernamePasswordToken) authcToken;

String username = token.getUsername();

String password = String.valueOf(token.getPassword());

Map<String, Object> map =`new`HashMap<String, Object>();

map.put(`"nickname"`, username);

//密码进行加密处理  明文为  password+name

String paw = password+username;

String pawDES = MyDES.encryptBasedDes(paw);

map.put(`"pswd"`, pawDES);

User user =`new`User();

user.setId(`"112222"`);

user.setUsername(username);

user.setPassword(pawDES);

return`new`SimpleAuthenticationInfo(user, password, getName());

}

}

3.实现ShiroConfiguration

[Java] _纯文本查看_ _复制代码_

?

01

02

03

04

05

06

07

08

09

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

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

@Configuration

public`class`ShiroConfiguration {

/**

* ShiroFilterFactoryBean 处理拦截资源文件问题。

* 注意:单独一个ShiroFilterFactoryBean配置是或报错的,以为在

* 初始化ShiroFilterFactoryBean的时候需要注入:SecurityManager

*

* Filter Chain定义说明 1、一个URL可以配置多个Filter,使用逗号分隔 2、当设置多个过滤器时,全部验证通过,才视为通过

* 3、部分过滤器可指定参数,如perms,roles

*

*/

@Bean

public`ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {`

ShiroFilterFactoryBean shiroFilterFactoryBean =`new`ShiroFilterFactoryBean();

// 必须设置 SecurityManager

shiroFilterFactoryBean.setSecurityManager(securityManager);

// 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面

shiroFilterFactoryBean.setLoginUrl(`"/login"`);

// 登录成功后要跳转的链接

shiroFilterFactoryBean.setSuccessUrl(`"/index"`);

// 未授权界面;

shiroFilterFactoryBean.setUnauthorizedUrl(`"/403"`);

//自定义拦截器

Map<String, Filter> filtersMap =`new`LinkedHashMap<String, Filter>();

//限制同一帐号同时在线的个数。

//filtersMap.put("kickout", kickoutSessionControlFilter());

shiroFilterFactoryBean.setFilters(filtersMap);

// 权限控制map.

Map<String, String> filterChainDefinitionMap =`new`LinkedHashMap<String, String>();

// 配置不会被拦截的链接 顺序判断

// 配置退出过滤器,其中的具体的退出代码Shiro已经替我们实现了

// 从数据库获取动态的权限

// filterChainDefinitionMap.put("/add", "perms[权限添加]");

// <!-- 过滤链定义,从上向下顺序执行,一般将 /**放在最为下边 -->:这是一个坑呢,一不小心代码就不好使了;

// <!-- authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问-->

//logout这个拦截器是shiro已经实现好了的。

// 从数据库获取

/*List<SysPermissionInit> list = sysPermissionInitService.selectAll();

for (SysPermissionInit sysPermissionInit : list) {

filterChainDefinitionMap.put(sysPermissionInit.getUrl(),

sysPermissionInit.getPermissionInit());

}*/

shiroFilterFactoryBean

.setFilterChainDefinitionMap(filterChainDefinitionMap);

return shiroFilterFactoryBean;

}

@Bean

public SecurityManager securityManager() {

DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();

// 设置realm.

securityManager.setRealm(myShiroRealm());

// 自定义缓存实现 使用redis

//securityManager.setCacheManager(cacheManager());

// 自定义session管理 使用redis

//securityManager.setSessionManager(sessionManager());

//注入记住我管理器;

securityManager.setRememberMeManager(rememberMeManager());

return securityManager;

}

public MyShiroRealm myShiroRealm(){

return new MyShiroRealm();

}

/**

* cookie对象;

* @return

*/

public SimpleCookie rememberMeCookie(){

//这个参数是cookie的名称,对应前端的checkbox的name = rememberMe

SimpleCookie simpleCookie = new SimpleCookie("rememberMe");

//<!-- 记住我cookie生效时间30天 ,单位秒;-->

simpleCookie.setMaxAge(2592000);

return simpleCookie;

}

/**

* cookie管理对象;记住我功能

* @return

*/

public`CookieRememberMeManager rememberMeManager(){`

CookieRememberMeManager cookieRememberMeManager =`new`CookieRememberMeManager();

cookieRememberMeManager.setCookie(rememberMeCookie());

//rememberMe cookie加密的密钥 建议每个项目都不一样 默认AES算法 密钥长度(128 256 512 位)

cookieRememberMeManager.setCipherKey(Base64.decode(`"3AvVhmFLUs0KTA3Kprsdag=="`));

return`cookieRememberMeManager;`

}

}

4.编写LoginController类测试Shiro

[Java] _纯文本查看_ _复制代码_

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

@RestController

public`class`LoginController {

@RequestMapping`(value="/login",method=RequestMethod.POST)`

public`String login(String username, String password,String vcode,Boolean rememberMe){`

System.out.println(username);

UsernamePasswordToken token =`new`UsernamePasswordToken(username, password,rememberMe);

SecurityUtils.getSubject().login(token);

return`"loginSuccess"`;

}

@RequestMapping`(value="/index",method=RequestMethod.GET)`

public`String home(){`

Subject subject = SecurityUtils.getSubject();

User principal = (User)subject.getPrincipal();

return`"Home"`;

}

}

引自博客:https://blog.csdn.net/u012343...

点赞
收藏
评论区
推荐文章
Stella981 Stella981
3年前
Shiro简介——跟我学习springmvc shiro mybatis
1.1 简介ApacheShiro是Java的一个安全框架。目前,使用ApacheShiro的人越来越多,因为它相当简单,对比SpringSecurity,可能没有SpringSecurity做的功能强大,但是在实际工作时可能并不需要那么复杂的东西,所以使用小而简单的Shiro就足够了。对于它俩到底哪个好,这个不必纠结,能更简单
Stella981 Stella981
3年前
Spring Security使用详解1(基本用法 )
一般项目都会有严格的认证和授权操作,而在Java开发领域常见的安全框架有Shiro和SpringSecurity。本文首先介绍下后者。一、基本用法1、什么是SpringSecurity?SpringSecurity是一个相对复杂的安全管理框架,功能比Shiro更加强大,权限控制细粒度更高,对O
Stella981 Stella981
3年前
SpringBoot + Redis + Shiro 实现权限管理(转)
概述  本文基于网上整理,为了实现将Shiro框架的session存储到redis里面,进而实现基于Niginx负载均衡,多站点部署;maven下shiro依赖<!shiro<dependency<groupIdorg.apache.shiro</groupId
Stella981 Stella981
3年前
SpringBoot2.0高级案例(01): 整合 Shiro 框架,实现用户权限管理
一、Shiro简介1、基础概念ApacheShiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。作为一款安全框架Shiro的设计相当巧妙。Shiro的应用不依赖任何容器,它不仅可以在JavaEE下使用,还可以应用在JavaSE环境中。2、核心角色1)Subject:
Stella981 Stella981
3年前
Shiro配置cookie以及共享Session和Session失效问题
首先我们看Shiro的会话管理器的配置<!shiro会话管理<!即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通JavaSE环境的,也可以是如Web环境的<beanid"sessionManager"class"org.apache.s
Easter79 Easter79
3年前
SpringBoot2.0高级案例(01): 整合 Shiro 框架,实现用户权限管理
一、Shiro简介1、基础概念ApacheShiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。作为一款安全框架Shiro的设计相当巧妙。Shiro的应用不依赖任何容器,它不仅可以在JavaEE下使用,还可以应用在JavaSE环境中。2、核心角色1)Subject:
Stella981 Stella981
3年前
Spring Shiro 使用默认的Session会话管理
项目中用到了shirosession会话管理机制,今天来总结一下,以下都是在springboot框架实现。shiro的session管理机制很完善,也是独立于j2ee容器且不依赖的,所以我们完全可以使用shiro提供给我们的session会话管理来实现我们的业务逻辑,默认提供的sessionDAO是memorySessionDAO,这里也主要讲它的配
Stella981 Stella981
3年前
Shiro 放行Swagger
一、前言在使用SpringBootShiroMybatisSwagger开发后台权限管理系统的时候,由于SpringBoot采用了Shiro框架,同时API接口文档使用的Swagger,遇到一个问题,在SpringBoot集成Shiro后,访问Swagger接口需要登陆才可以,由于在项目成型之前需要做接口测试,所以这里记录下如何在Shi
Stella981 Stella981
3年前
Shiro 核心功能案例讲解 基于SpringBoot 有源码
Shiro核心功能案例讲解基于SpringBoot有源码从实战中学习Shiro的用法。本章使用SpringBoot快速搭建项目。整合SiteMesh框架布局页面。整合Shiro框架实现用身份认证,授权,数据加密功能。通过本章内容,你将学会用户权限的分配规则,SpringBoot整合Sh
Stella981 Stella981
3年前
Shiro权限相关配置文件
Shiro权限框架开发系统中,少不了权限,目前java里的权限框架有SpringSecurity和Shiro(以前叫做jsecurity),对于SpringSecurity:功能太过强大以至于功能比较分散,使用起来也比较复杂,跟Spring结合的比较好。对于初学SpringSecurity者来说,曲线还是较大,需要深入学习其源码和框架,配置起
Shiro权限控制入门
Shiro权限控制是一款优秀的Java安全框架,可用于对Java应用程序进行身份验证、授权、加密和会话管理等功能。本文将简要介绍Shiro权限控制框架的几个关键概念和使用方法。