Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 0de07da

Browse files
权限修改,更新缓存
1 parent 7bac649 commit 0de07da

File tree

13 files changed

+111
-14
lines changed

13 files changed

+111
-14
lines changed

‎src/main/java/com/study/config/RedisConfig.java‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,5 @@ public JedisPool redisPoolFactory() {
4242

4343
return jedisPool;
4444
}
45+
4546
}

‎src/main/java/com/study/config/ShiroConfig.java‎

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.study.shiro.MyShiroRealm;
88
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
99
import org.apache.shiro.mgt.SecurityManager;
10+
import org.apache.shiro.spring.LifecycleBeanPostProcessor;
1011
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
1112
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
1213
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
@@ -40,6 +41,11 @@ public class ShiroConfig {
4041
@Value("${spring.redis.timeout}")
4142
private int timeout;
4243

44+
@Bean
45+
public static LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {
46+
return new LifecycleBeanPostProcessor();
47+
}
48+
4349
/**
4450
* ShiroDialect,为了在thymeleaf里使用shiro的标签的bean
4551
* @return
@@ -106,7 +112,7 @@ public SecurityManager securityManager(){
106112
//设置realm.
107113
securityManager.setRealm(myShiroRealm());
108114
// 自定义缓存实现 使用redis
109-
securityManager.setCacheManager(cacheManager());
115+
//securityManager.setCacheManager(cacheManager());
110116
// 自定义session管理 使用redis
111117
securityManager.setSessionManager(sessionManager());
112118
return securityManager;
@@ -176,6 +182,7 @@ public RedisCacheManager cacheManager() {
176182
return redisCacheManager;
177183
}
178184

185+
179186
/**
180187
* RedisSessionDAO shiro sessionDao层的实现 通过redis
181188
* 使用的是shiro-redis开源插件
@@ -188,13 +195,13 @@ public RedisSessionDAO redisSessionDAO() {
188195
}
189196

190197
/**
191-
* Session Manager
192-
* 使用的是shiro-redis开源插件
198+
* shiro session的管理
193199
*/
194200
@Bean
195201
public DefaultWebSessionManager sessionManager() {
196202
DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
197203
sessionManager.setSessionDAO(redisSessionDAO());
198204
return sessionManager;
199205
}
206+
200207
}

‎src/main/java/com/study/controller/ResourcesController.java‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.study.service.ResourcesService;
66
import com.study.shiro.ShiroService;
77
import org.apache.shiro.SecurityUtils;
8+
import org.springframework.cache.annotation.CacheEvict;
89
import org.springframework.web.bind.annotation.RequestMapping;
910
import org.springframework.web.bind.annotation.RequestParam;
1011
import org.springframework.web.bind.annotation.RestController;
@@ -56,6 +57,7 @@ public List<Resources> loadMenu(){
5657
return resourcesList;
5758
}
5859

60+
@CacheEvict(cacheNames="resources", allEntries=true)
5961
@RequestMapping(value = "/add")
6062
public String add(Resources resources){
6163
try{
@@ -68,7 +70,7 @@ public String add(Resources resources){
6870
return "fail";
6971
}
7072
}
71-
73+
@CacheEvict(cacheNames="resources", allEntries=true)
7274
@RequestMapping(value = "/delete")
7375
public String delete(Integer id){
7476
try{

‎src/main/java/com/study/mapper/UserRoleMapper.java‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,8 @@
33
import com.study.model.UserRole;
44
import com.study.util.MyMapper;
55

6+
import java.util.List;
7+
68
public interface UserRoleMapper extends MyMapper<UserRole> {
9+
public List<Integer> findUserIdByRoleId(Integer roleId);
710
}

‎src/main/java/com/study/service/impl/RoleResourcesServiceImpl.java‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,34 @@
11
package com.study.service.impl;
22

3+
import com.study.mapper.UserRoleMapper;
34
import com.study.model.RoleResources;
45
import com.study.service.RoleResourcesService;
6+
import com.study.shiro.ShiroService;
7+
import org.springframework.cache.annotation.CacheEvict;
58
import org.springframework.stereotype.Service;
69
import org.springframework.transaction.annotation.Propagation;
710
import org.springframework.transaction.annotation.Transactional;
811
import org.springframework.util.StringUtils;
912
import tk.mybatis.mapper.entity.Example;
1013

14+
import javax.annotation.Resource;
15+
import java.util.List;
16+
1117
/**
1218
* Created by yangqj on 2017年4月26日.
1319
*/
1420
@Service("roleResourcesService")
1521
public class RoleResourcesServiceImpl extends BaseService<RoleResources> implements RoleResourcesService {
22+
/* @Resource
23+
private UserRoleMapper userRoleMapper;
24+
@Resource
25+
private ShiroService shiroService;*/
26+
27+
1628
@Override
29+
//更新权限
1730
@Transactional(propagation= Propagation.REQUIRED,readOnly=false,rollbackFor={Exception.class})
31+
@CacheEvict(cacheNames="resources", allEntries=true)
1832
public void addRoleResources(RoleResources roleResources) {
1933
//删除
2034
Example example = new Example(RoleResources.class);
@@ -31,5 +45,11 @@ public void addRoleResources(RoleResources roleResources) {
3145
mapper.insert(r);
3246
}
3347
}
48+
49+
//List<Integer> userIds= userRoleMapper.findUserIdByRoleId(roleResources.getRoleid());
50+
//更新当前登录的用户的权限缓存
51+
//shiroService.clearUserAuthByUserId(userIds);
52+
53+
3454
}
3555
}

‎src/main/java/com/study/shiro/MyShiroRealm.java‎

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.apache.shiro.realm.AuthorizingRealm;
1212
import org.apache.shiro.session.Session;
1313
import org.apache.shiro.subject.PrincipalCollection;
14+
import org.apache.shiro.subject.SimplePrincipalCollection;
1415
import org.apache.shiro.util.ByteSource;
1516
import tk.mybatis.mapper.entity.Example;
1617

@@ -56,7 +57,7 @@ protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token)
5657
throw new LockedAccountException(); // 帐号锁定
5758
}
5859
SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(
59-
user, //用户名
60+
user, //用户
6061
user.getPassword(), //密码
6162
ByteSource.Util.bytes(username),
6263
getName() //realm name
@@ -67,4 +68,15 @@ protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token)
6768
session.setAttribute("userSessionId", user.getId());
6869
return authenticationInfo;
6970
}
71+
72+
/**
73+
* 指定principalCollection 清除
74+
*/
75+
public void clearCachedAuthorizationInfo(PrincipalCollection principalCollection) {
76+
77+
SimplePrincipalCollection principals = new SimplePrincipalCollection(
78+
principalCollection, getName());
79+
super.clearCachedAuthorizationInfo(principals);
80+
}
81+
7082
}

‎src/main/java/com/study/shiro/ShiroService.java‎

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,22 @@
22

33
import com.github.pagehelper.util.StringUtil;
44
import com.study.model.Resources;
5+
import com.study.model.User;
56
import com.study.service.ResourcesService;
7+
import org.apache.shiro.SecurityUtils;
8+
import org.apache.shiro.mgt.RealmSecurityManager;
9+
import org.apache.shiro.session.Session;
610
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
11+
import org.apache.shiro.subject.SimplePrincipalCollection;
12+
import org.apache.shiro.subject.support.DefaultSubjectContext;
713
import org.apache.shiro.web.filter.mgt.DefaultFilterChainManager;
814
import org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver;
915
import org.apache.shiro.web.servlet.AbstractShiroFilter;
16+
import org.crazycake.shiro.RedisSessionDAO;
1017
import org.springframework.beans.factory.annotation.Autowired;
1118
import org.springframework.stereotype.Service;
1219

13-
import java.util.LinkedHashMap;
14-
import java.util.List;
15-
import java.util.Map;
20+
import java.util.*;
1621

1722
/**
1823
* Created by yangqj on 2017年4月30日.
@@ -23,7 +28,8 @@ public class ShiroService {
2328
private ShiroFilterFactoryBean shiroFilterFactoryBean;
2429
@Autowired
2530
private ResourcesService resourcesService;
26-
31+
@Autowired
32+
private RedisSessionDAO redisSessionDAO;
2733
/**
2834
* 初始化权限
2935
*/
@@ -87,4 +93,40 @@ public void updatePermission() {
8793
System.out.println("更新权限成功!!");
8894
}
8995
}
96+
97+
/**
98+
* 根据userId 清除当前session存在的用户的权限缓存
99+
* @param userIds 已经修改了权限的userId
100+
*/
101+
public void clearUserAuthByUserId(List<Integer> userIds){
102+
if(null == userIds || userIds.size() == 0) return ;
103+
//获取所有session
104+
Collection<Session> sessions = redisSessionDAO.getActiveSessions();
105+
//定义返回
106+
List<SimplePrincipalCollection> list = new ArrayList<SimplePrincipalCollection>();
107+
for (Session session:sessions){
108+
//获取session登录信息。
109+
Object obj = session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY);
110+
if(null != obj && obj instanceof SimplePrincipalCollection){
111+
//强转
112+
SimplePrincipalCollection spc = (SimplePrincipalCollection)obj;
113+
//判断用户,匹配用户ID。
114+
obj = spc.getPrimaryPrincipal();
115+
if(null != obj && obj instanceof User){
116+
User user = (User) obj;
117+
System.out.println("user:"+user);
118+
//比较用户ID,符合即加入集合
119+
if(null != user && userIds.contains(user.getId())){
120+
list.add(spc);
121+
}
122+
}
123+
}
124+
}
125+
RealmSecurityManager securityManager =
126+
(RealmSecurityManager) SecurityUtils.getSecurityManager();
127+
MyShiroRealm realm = (MyShiroRealm)securityManager.getRealms().iterator().next();
128+
for (SimplePrincipalCollection simplePrincipalCollection : list) {
129+
realm.clearCachedAuthorizationInfo(simplePrincipalCollection);
130+
}
131+
}
90132
}

‎src/main/java/com/study/util/PasswordHelper.java‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,15 @@ public class PasswordHelper {
1515
public void encryptPassword(User user) {
1616
//String salt=randomNumberGenerator.nextBytes().toHex();
1717
String newPassword = new SimpleHash(algorithmName, user.getPassword(), ByteSource.Util.bytes(user.getUsername()), hashIterations).toHex();
18+
//String newPassword = new SimpleHash(algorithmName, user.getPassword()).toHex();
1819
user.setPassword(newPassword);
20+
1921
}
2022
public static void main(String[] args) {
2123
PasswordHelper passwordHelper = new PasswordHelper();
2224
User user = new User();
23-
user.setUsername("user1");
24-
user.setPassword("user1");
25+
user.setUsername("admin");
26+
user.setPassword("admin");
2527
passwordHelper.encryptPassword(user);
2628
System.out.println(user);
2729
}

‎src/main/resources/application.properties‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,17 @@ pagehelper.supportMethodsArguments=true
4040
pagehelper.params=count\=countSql
4141

4242
#redis
43+
# Redis服务器地址
4344
spring.redis.host= localhost
45+
# Redis服务器连接端口
4446
spring.redis.port= 6379
47+
# 连接池中的最大空闲连接
4548
spring.redis.pool.max-idle= 8
49+
# 连接池中的最小空闲连接
4650
spring.redis.pool.min-idle= 0
51+
# 连接池最大连接数(使用负值表示没有限制)
4752
spring.redis.pool.max-active= 8
53+
# 连接池最大阻塞等待时间(使用负值表示没有限制)
4854
spring.redis.pool.max-wait= -1
55+
# 连接超时时间(毫秒)
4956
spring.redis.timeout= 0

‎src/main/resources/mapper/UserRoleMapper.xml‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,8 @@
88
<result column="userId" jdbcType="INTEGER" property="userid" />
99
<result column="roleId" jdbcType="INTEGER" property="roleid" />
1010
</resultMap>
11+
12+
<select id="findUserIdByRoleId" parameterType="int" resultType="int">
13+
select userId from user_role where roleId = #{roleId}
14+
</select>
1115
</mapper>

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /