ysc/APDPlat

Spring Sevurity的疑问

Closed this issue · 3 comments

在Role.java中的getAuthorities方法中
/**
* 获取授予角色的权利
* @return
*/
public List getAuthorities() {
List result = new ArrayList<>();
if (superManager) {
result.add("ROLE_SUPERMANAGER");
}
for (Command command : commands) {
Map<String,String> map=ModuleService.getCommandPathToRole(command);
for(String role : map.values()){
StringBuilder str = new StringBuilder();
str.append("ROLE_MANAGER").append(role);
result.add(str.toString());
}
}
return result;
}

这里判断是否是超级管理员
既然是超级管理员为什么还要取出下面的他所拥有的command?

在SpringSecurityService.java中
RequestKey key=new RequestKey("/","POST");
value=new ArrayList<>();
value.add(superManager);
requestMap.put(key, value);
//GET
key=new RequestKey("/
","GET");
requestMap.put(key, value);

这里不是添加了对给superManager所有的get post请求吗?

求杨大哥指点...

ysc commented

事实上,一个角色如果是超级管理员,那么它的commands是为空的
参考RoleAction的方法assemblyModelForCreate
if(model.isSuperManager()){
return;
}
model.setCommands(commands);
参考RoleAction的方法assemblyModelForUpdate
if(model.isSuperManager()){
model.clearCommand();
return;
}

ysc commented

在SpringSecurityService.java中

//普通管理员
SecurityConfig manager=new SecurityConfig("ROLE_MANAGER");
//超级管理员
SecurityConfig superManager=new SecurityConfig("ROLE_SUPERMANAGER");

//1、处理特殊的url访问规则
Collection value=new ArrayList<>();
value.add(manager);
value.add(superManager);
//2、动态指定系统中模块及命令的url访问规则
value=new ArrayList<>();
//要把路径转换为角色
//如:命令路径:/**/security/user!query 映射角色:_SECURITY_USER_QUERY
value.add(new SecurityConfig("ROLE_MANAGER"+map.get(path)));
value.add(superManager);
//3、超级管理员对所有的POST操作具有权限
//4、超级管理员对所有的GET操作具有权限
value=new ArrayList<>();
value.add(superManager);

只要用户被授予过权限,一旦登陆系统,就自动拥有manager权限,manager权限是为了访问特殊的url