1. 程式人生 > >詳解spring整合shiro許可權管理與資料庫設計

詳解spring整合shiro許可權管理與資料庫設計

現在基本上所有的後臺系統都逃不過許可權管理這一塊,這算是一個剛需了。現在我們來整合shiro來達到顆粒化許可權管理,也就是從連線選單到頁面功能按鈕,都進行許可權都驗證,從前端按鈕的顯示隱藏,到後臺具體功能方法的許可權驗證。

首先要先設計好我們的資料庫,先來看一張比較粗糙的資料庫設計圖:

具體的資料庫設計程式碼

?

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

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

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

/*

Navicat MySQL Data Transfer

Source Server     : 本機

Source Server Version : 50537

Source Host      : localhost:3306

Source Database    : task

Target Server Type  : MYSQL

Target Server Version : 50537

File Encoding     : 65001

Date: 2017-01-19 09:58:27

*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------

-- Table structure for sys_authority

-- ----------------------------

DROP TABLE IF EXISTS `sys_authority`;

CREATE TABLE `sys_authority` (

`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵',

`data_url` varchar(100) NOT NULL COMMENT '連線路徑或方法',

`menu_class` varchar(50) NOT NULL COMMENT '選單樣式',

`menu_code` varchar(50) NOT NULL COMMENT '選單編碼',

`menu_name` varchar(50) NOT NULL COMMENT '選單名稱',

`parent_menucode` varchar(50) DEFAULT NULL COMMENT '上級選單編碼',

`sequence` bigint(20) DEFAULT '0' COMMENT '排序',

`menu_type` varchar(2) DEFAULT '1' COMMENT '選單型別(1是左導航選單 2是按鈕許可權)',

`create_time` varchar(30) NOT NULL COMMENT '建立時間',

PRIMARY KEY (`id`),

UNIQUE KEY `uk_sys_authority_menu_code` (`menu_code`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='選單表';

-- ----------------------------

-- Records of sys_authority

-- ----------------------------

-- ----------------------------

-- Table structure for sys_department

-- ----------------------------

DROP TABLE IF EXISTS `sys_department`;

CREATE TABLE `sys_department` (

`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵',

`department_key` varchar(20) NOT NULL COMMENT '部門編碼',

`department_value` varchar(40) NOT NULL COMMENT '部門名稱',

`description` varchar(200) DEFAULT NULL COMMENT '描述',

`parent_departmentkey` varchar(20) DEFAULT NULL COMMENT '上級部門編碼',

`create_time` varchar(30) DEFAULT NULL COMMENT '建立時間',

PRIMARY KEY (`id`),

UNIQUE KEY `uk_sys_department_department_key` (`department_key`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='部門表';

-- ----------------------------

-- Records of sys_department

-- ----------------------------

-- ----------------------------

-- Table structure for sys_role

-- ----------------------------

DROP TABLE IF EXISTS `sys_role`;

CREATE TABLE `sys_role` (

`role_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵',

`role_key` varchar(30) DEFAULT NULL COMMENT '角色編碼',

`create_time` varchar(30) DEFAULT NULL COMMENT '建立時間',

`description` varchar(200) DEFAULT NULL COMMENT '描述',

`role_value` varchar(40) NOT NULL COMMENT '角色名稱',

`company_id` bigint(20) DEFAULT NULL,

PRIMARY KEY (`role_id`)

) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='角色表';

-- ----------------------------

-- Records of sys_role

-- ----------------------------

INSERT INTO `sys_role` VALUES ('1', 'ROLE_USER', null, null, '', null);

INSERT INTO `sys_role` VALUES ('2', 'ROLE_ADMIN', null, null, '', null);

-- ----------------------------

-- Table structure for sys_role_authority

-- ----------------------------

DROP TABLE IF EXISTS `sys_role_authority`;

CREATE TABLE `sys_role_authority` (

`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵編號自增長',

`menu_code` varchar(50) NOT NULL COMMENT '選單編碼',

`role_key` varchar(40) NOT NULL COMMENT '角色編碼',

`menu_type` int(11) DEFAULT NULL COMMENT '選單型別 1 導航 2 按鈕',

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色選單表';

-- ----------------------------

-- Records of sys_role_authority

-- ----------------------------

-- ----------------------------

-- Table structure for sys_role_permission

-- ----------------------------

DROP TABLE IF EXISTS `sys_role_permission`;

CREATE TABLE `sys_role_permission` (

`role_id` int(11) NOT NULL COMMENT '角色主鍵編號',

`permissions` varchar(1000) DEFAULT NULL COMMENT '按鈕許可權',

KEY `FK9q28ewrhntqeipl1t04kh1be7` (`role_id`),

CONSTRAINT `FK9q28ewrhntqeipl1t04kh1be7` FOREIGN KEY (`role_id`) REFERENCES `sys_role` (`role_id`),

CONSTRAINT `fk_sys_role_permission_role_id` FOREIGN KEY (`role_id`) REFERENCES `sys_role` (`role_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色按鈕許可權表';

-- ----------------------------

-- Records of sys_role_permission

-- ----------------------------

-- ----------------------------

-- Table structure for sys_user

-- ----------------------------

DROP TABLE IF EXISTS `sys_user`;

CREATE TABLE `sys_user` (

`user_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵',

`login_account` varchar(30) NOT NULL COMMENT '登入賬號',

`login_pass` varchar(65) NOT NULL COMMENT '登入密碼',

`user_name` varchar(20) DEFAULT NULL COMMENT '暱稱',

`user_head` varchar(30) DEFAULT NULL COMMENT '頭像',

`user_phone` varchar(20) DEFAULT NULL COMMENT '手機',

`user_email` varchar(30) DEFAULT NULL COMMENT '郵箱',

`user_sex` int(11) DEFAULT NULL COMMENT '性別',

`user_birthday` varchar(30) DEFAULT NULL COMMENT '生日',

`register_time` varchar(30) NOT NULL COMMENT '註冊時間',

`department_key` varchar(20) DEFAULT NULL COMMENT '部門編碼',

PRIMARY KEY (`user_id`),

UNIQUE KEY `uk_sys_user_login_account` (`login_account`)

) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COMMENT='使用者表';

-- ----------------------------

-- Records of sys_user

-- ----------------------------

INSERT INTO `sys_user` VALUES ('2', 'hzw2312', '63cbbfefc6a5f389ea64299134e989a9a378d1293cad8b5623331bf5d0e023a9', null, null, null, '[email protected]', null, null, '2017-01-18 14:39:23', null);

INSERT INTO `sys_user` VALUES ('3', 'hzw2312f', '63cbbfefc6a5f389ea64299134e989a9a378d1293cad8b5623331bf5d0e023a9', null, null, null, '[email protected]', null, null, '2017-01-18 15:25:08', null);

INSERT INTO `sys_user` VALUES ('4', 'hhsykx', '63cbbfefc6a5f389ea64299134e989a9a378d1293cad8b5623331bf5d0e023a9', null, null, null, '[email protected]', null, null, '2017-01-18 15:25:47', null);

-- ----------------------------

-- Table structure for sys_user_role

-- ----------------------------

DROP TABLE IF EXISTS `sys_user_role`;

CREATE TABLE `sys_user_role` (

`user_id` bigint(20) NOT NULL COMMENT '使用者編號',

`role_id` int(20) NOT NULL COMMENT '角色編號',

PRIMARY KEY (`user_id`,`role_id`),

KEY `FKhh52n8vd4ny9ff4x9fb8v65qx` (`role_id`),

CONSTRAINT `FKb40xxfch70f5qnyfw8yme1n1s` FOREIGN KEY (`user_id`) REFERENCES `sys_user` (`user_id`),

CONSTRAINT `FKhh52n8vd4ny9ff4x9fb8v65qx` FOREIGN KEY (`role_id`) REFERENCES `sys_role` (`role_id`),

CONSTRAINT `fk_sys_user_role_role_id` FOREIGN KEY (`role_id`) REFERENCES `sys_role` (`role_id`),

CONSTRAINT `fk_sys_user_role_user_id` FOREIGN KEY (`user_id`) REFERENCES `sys_user` (`user_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='使用者角色對映表';

-- ----------------------------

-- Records of sys_user_role

-- ----------------------------

INSERT INTO `sys_user_role` VALUES ('3', '1');

INSERT INTO `sys_user_role` VALUES ('4', '1');

INSERT INTO `sys_user_role` VALUES ('2', '2');

下面我們開始根據之前的框架整合shiro

首先在pom.xml新增shiro的支援,先在properties中宣告一下要倒入的版本:

?

1

2

3

4

<properties>

<shiro.version>1.3.2</shiro.version>

<commons-logging.version>1.2</commons-logging.version>

</properties>

然後在是dependency的新增:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

<!-- shiro許可權 -->

<dependency>

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

<artifactId>shiro-all</artifactId>

<version>${shiro.version}</version>

</dependency>

<!-- commons-logging -->

<dependency>

<groupId>commons-logging</groupId>

<artifactId>commons-logging</artifactId>

<version>${commons-logging.version}</version>

</dependency>

下面是shiro的配置跟spring配置放在同級目錄spring-shiro.xml:

?

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

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

98

99

100

101

102

103

104

105

106

<?xml version="1.0" encoding="UTF-8"?>

xsi:schemaLocation="

<!-- 快取管理器 使用Ehcache實現 -->

<bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">

<property name="cacheManagerConfigFile" value="classpath:ehcache-shiro.xml" />

</bean>

<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">

<!--認證管理器-->

<property name="realm" ref="shiroSecurityRealm" />

<!-- 快取管理器 -->

<property name="cacheManager" ref="cacheManager" />

<!-- rememberMe管理器 -->

<property name="rememberMeManager" ref="rememberMeManager"/>

</bean>

<!-- 會話ID生成器 -->

<bean id="sessionIdGenerator" class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator"/>

<!-- 會話Cookie模板 -->

<bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">

<constructor-arg value="sid"/>

<property name="httpOnly" value="true"/>

<property name="maxAge" value="-1"/>

</bean>

<bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie"

<constructor-arg value="rememberMe"/> 

<property name="httpOnly" value="true"/>

<property name="maxAge" value="2592000"/><!-- 30天 --> 

</bean>

<!-- rememberMe管理器 -->

<bean id="rememberMeManager"

class="org.apache.shiro.web.mgt.CookieRememberMeManager"

<property name="cipherKey" value="#{T(org.apache.shiro.codec.Base64).decode('7gzYfKjTASKdsai43ds==')}"/> 

<property name="cookie" ref="rememberMeCookie"/>

</bean>

<!-- 會話DAO -->

<bean id="sessionDAO" class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO">

<property name="activeSessionsCacheName" value="shiro-activeSessionCache"/>

<property name="sessionIdGenerator" ref="sessionIdGenerator"/>

</bean>

<!-- 會話驗證排程器 -->

<bean id="sessionValidationScheduler" class="org.apache.shiro.session.mgt.quartz.QuartzSessionValidationScheduler">

<property name="sessionValidationInterval" value="3000000"/>

<property name="sessionManager" ref="sessionManager"/>

</bean>

<!-- 會話管理器 -->

<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">

<property name="globalSessionTimeout" value="3000000"/>

<property name="deleteInvalidSessions" value="true"/>

<property name="sessionValidationSchedulerEnabled" value="true"/>

<property name="sessionValidationScheduler" ref="sessionValidationScheduler"/>

<property name="sessionDAO" ref="sessionDAO"/>

<property name="sessionIdCookieEnabled" value="true"/>

<property name="sessionIdCookie" ref="sessionIdCookie"/>

</bean>

<bean id="formAuthenticationFilter" class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter"

<property name="rememberMeParam" value="rememberMe"/> 

</bean>

<bean id="sysUserFilter" class="yfkj.gz.task.security.SysUserFilter"/>

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">

<property name="securityManager" ref="securityManager"/>

<property name="loginUrl" value="/login.jsp"/>

<property name="successUrl" value="/page/main.action"/>

<property name="filters">

<util:map>

<entry key="authc">

<bean class="org.apache.shiro.web.filter.authc.PassThruAuthenticationFilter"/>

</entry>

<entry key="sysUser" value-ref="sysUserFilter"/>

</util:map>

</property>

<property name="filterChainDefinitions">

<value>

/static/** = anon

/login.jsp = anon

/sysuser/login.action = anon

/sysuser/register.action = anon

/sysuser/getEMailCount.action = anon

/sysuser/getUserNameCount.action = anon

/sysuser/logout.action = logout

/** = user,sysUser <!-- 表示訪問該地址的使用者是身份驗證通過或RememberMe登入的都可以 -->

<!-- /** = authc 表示訪問該地址使用者必須身份驗證通過-->

</value>

</property>

</bean>

<!-- Post processor that automatically invokes init() and destroy() methods -->

<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>

</beans>

上面的

/static/** = anon,/login.jsp = anon...這些等於anon的就是預設不做許可權驗證的,我們的登入,註冊,靜態資源等,不需要許可權驗證。

許可權快取的配置(如果不用快取的話,每次請求都要去訪問資料庫查詢許可權)ehcache-shiro.xml:

?

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

50

51

52

53

54

55

56

57

58

59

<?xml version="1.0" encoding="UTF-8"?>

<ehcache name="shirocache">

<diskStore path="java.io.tmpdir/yfkj-shiro-ehcache"/>

<!-- 預設快取 -->

<defaultCache maxElementsInMemory="1000" eternal="false"

overflowToDisk="true" timeToIdleSeconds="300" timeToLiveSeconds="180"

diskPersistent="false" diskExpiryThreadIntervalSeconds="120" />

<!-- 登入記錄快取 -->

<cache name="passwordRetryCache"

maxEntriesLocalHeap="2000"

eternal="false"

timeToIdleSeconds="3600"

timeToLiveSeconds="0"

overflowToDisk="false"

statistics="true">

</cache>

<!-- 授權快取 -->

<cache name="authorizationCache"

maxEntriesLocalHeap="2000"

eternal="false"

timeToIdleSeconds="3600"

timeToLiveSeconds="0"

overflowToDisk="false"

statistics="true">

</cache>

<!-- 認證快取 -->

<cache name="authenticationCache"

maxEntriesLocalHeap="2000"

eternal="false"

timeToIdleSeconds="3600"

timeToLiveSeconds="0"

overflowToDisk="false"

statistics="true">

</cache>

<cache name="shiro-activeSessionCache"

maxEntriesLocalHeap="2000"

eternal="false"

timeToIdleSeconds="3600"

timeToLiveSeconds="0"

overflowToDisk="false"

statistics="true">

</cache>

<cache name="shiro-kickout-session"

maxEntriesLocalHeap="2000"

eternal="false"

timeToIdleSeconds="3600"

timeToLiveSeconds="0"

overflowToDisk="false"

statistics="true">

</cache>

</ehcache>

自定義使用者過濾類SysUserFilter:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

import yfkj.gz.task.service.ISysUserService;

import org.apache.shiro.web.filter.PathMatchingFilter;

import javax.annotation.Resource;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

/**

* 自定義使用者過濾器

* @author 胡漢三

*

*/

public class SysUserFilter extends PathMatchingFilter {

@Resource

private ISysUserService sysUserService;

@Override

protected boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {

return true;

}

}

許可權認證類ShiroSecurityRealm:

?

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

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

import javax.annotation.Resource;

import org.apache.shiro.authc.AuthenticationException;

import org.apache.shiro.authc.AuthenticationInfo;

import org.apache.shiro.authc.AuthenticationToken;

import org.apache.shiro.authc.SimpleAuthenticationInfo;

import org.apache.shiro.authc.UsernamePasswordToken;

import org.apache.shiro.authc.credential.Sha256CredentialsMatcher;

import org.apache.shiro.authz.AuthorizationInfo;

import org.apache.shiro.authz.SimpleAuthorizationInfo;

import org.apache.shiro.realm.AuthorizingRealm;

import org.apache.shiro.subject.PrincipalCollection;

import org.springframework.stereotype.Component;

import yfkj.gz.task.dao.ISysUserDao;

import yfkj.gz.task.entity.SysRole;

import yfkj.gz.task.entity.SysUser;

import yfkj.gz.task.service.ISysUserService;

/**

* 許可權認證

* @author 胡漢三

* @date  2017年1月19日 上午10:52:17

*/

@SuppressWarnings("deprecation")

@Component

public class ShiroSecurityRealm extends AuthorizingRealm {

@Resource

private ISysUserService userService;

@Resource

private ISysUserDao sysUserDao;

public ShiroSecurityRealm() {

setName("ShiroSecurityRealm"); // This name must match the name in the SysUser class's getPrincipals() method

setCredentialsMatcher(new Sha256CredentialsMatcher());

}

/**

* 登入認證

*/

protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException {

UsernamePasswordToken token = (UsernamePasswordToken) authcToken;

SysUser user = userService.getByProerties(new String[]{"loginAccount"}, new String[]{token.getUsername()},null);

if (user != null) {

return new SimpleAuthenticationInfo(user.getUserId(), user.getLoginPass(), getName());

} else {

return null;

}

}

/**

* 許可權認證

*/

protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {

Long userId = (Long) principals.fromRealm(getName()).iterator().next();

SysUser user = userService.get(userId);

if (user != null) {

SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();

for (SysRole role : user.getRoles()) {

info.addRole(role.getRoleKey());

info.addStringPermissions(role.getPermissions());

}

return info;

} else {

return null;

}

}

}

在web.xml加入:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

<!-- 載入spring配置檔案 -->

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>classpath:spring.xml,classpath:spring-hibernate.xml,classpath:spring-shiro.xml</param-value>

</context-param>

<!-- shiro許可權過濾器 -->

<filter>

<filter-name>shiroFilter</filter-name>

<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>

<init-param>

<param-name>targetFilterLifecycle</param-name>

<param-value>true</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>shiroFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

在登入方法中加上許可權的登入(構造方法引數:登入賬號,登入密碼,記住我):

?

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

//存入session

Subject subject = SecurityUtils.getSubject();

//記得傳入明文密碼

subject.login(new UsernamePasswordToken(userInfo.getLoginAccount(), user.getLoginPass(), rememberMe));

完整的登入方法:

[java] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片

/**

* 使用者登入

* @param response

* @param user

* @throws IOException

*/

@RequestMapping(value = "/login", method = { RequestMethod.POST, RequestMethod.GET })

public void login(SysUser user,boolean rememberMe) throws IOException{

//使用者登入

SysUser userInfo = userService.getByProerties(new String[]{"loginAccount"}, new String[]{user.getLoginAccount()},null);

if(userInfo==null){

result.setMessage("使用者名稱錯誤");

super.writeJSON(result);

return;

}

if(!userInfo.getLoginPass().equals(new Sha256Hash(user.getLoginPass()).toHex())){

result.setMessage("密碼錯誤");

super.writeJSON(result);

return;

}

//存入session

Subject subject = SecurityUtils.getSubject();

//記得傳入明文密碼

subject.login(new UsernamePasswordToken(userInfo.getLoginAccount(), user.getLoginPass(), rememberMe));

session.setAttribute(USER_SESSION, userInfo);

result.setMessage("登入成功");

result.setSuccess(true);

super.writeJSON(result);

}

資料庫也設計好啦,該整合的也整合了,怎麼來實現呢,這裡先說一點點,詳細的等下一篇說:

jsp頁面引入page指令:

?

在要做驗證的按鈕上加上shiro標籤的判斷:

?

1

2

3

4

5

<shiro:hasPermission name="${ROLE_KEY}:role:role_add">

<button id="btn_add" type="button" class="btn btn-default">

<span class="glyphicon glyphicon-plus" aria-hidden="true"></span>新增

</button>

</shiro:hasPermission>

${ROLE_KEY}:role:role_add的意思就是:

${ROLE_KEY}角色

role是指選單(頁面)

role_add指的功能

聯合起來就是,當前角色在role選單(頁面)中有沒有role_add新增的功能,如果有就會顯示,沒有就不顯示這個按鈕啦。

在後臺方法中驗證:

在對應的方法中加入程式碼:

?

1

2

Subject subject = SecurityUtils.getSubject();

subject.checkPermission(getCurrentRoleKey()+":role:role_add");

如果沒有通過checkPermission,則會直接返回錯誤,不執行下面的程式碼啦。

實體Base類BaseEntity:

?

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

import java.io.Serializable;

import java.util.LinkedHashMap;

import java.util.Map;

/**

* 實體父類

* @author 胡漢三

* @date  2017年1月18日 上午11:03:11

*/

public class BaseEntity implements Serializable{

/**

*

*/

private static final long serialVersionUID = 3730369554400423966L;

/**

* 排序

*/

private Map<String, String> sortedConditions = new LinkedHashMap<String, String>();

public Map<String, String> getSortedConditions() {

return sortedConditions;

}

public void setSortedConditions(Map<String, String> sortedConditions) {

this.sortedConditions = sortedConditions;

}

}

使用者實體SysUser:

?

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

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

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

import java.util.HashSet;

import java.util.Set;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.FetchType;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

import javax.persistence.JoinTable;

import javax.persistence.JoinColumn;

import javax.persistence.ManyToMany;

import javax.persistence.Table;

import org.hibernate.annotations.Cache;

import org.hibernate.annotations.CacheConcurrencyStrategy;

import yfkj.gz.support.BaseEntity;

/**

* 使用者的實體類

*/

@Entity

@Table(name = "sys_user")

public class SysUser extends BaseEntity{

/**

*

*/

private static final long serialVersionUID = 2491111485758197830L;

/**主鍵**/

@Id

@GeneratedValue

@Column(name = "user_id")

private Long userId;

/**登入賬號**/

@Column(name = "login_account" ,length = 30 , unique = true )

private String loginAccount;

/**登入密碼**/

@Column(name = "login_pass" ,length = 65)

private String loginPass;

/**暱稱**/

@Column(name = "user_name" ,length = 20)