平台管理后台与商家菜单资源管理:平台管理后台的访问控制设计

愿天堂没有BUG

共 389字,需浏览 1分钟

 · 2022-04-10


平台管理后台的访问控制设计

这里的访问控制设计使用了Spring Secutiry来实现,这些内容与第10章SSO设计中的访问控制部分的实现方法相差不多,不同之处在于这里并不需要OAuth 2,而对权限管理的设计也使用了一种更为简便的方法来实现。下面略过一些相同的地方,只针对不同点进行说明。这些设计都是在模块manage-web 中实现的。


在访问控制中使用操作员

创建一个MyUserDetails类,实现Spring Secutiry的UserDetails,从而导入Operators用户及其权限管理,代码如下所示:

public class MyUserDetails implements UserDetails {
private String username;
private String password;
private Collection authorities;
private Operators operators;
public MyUserDetails(String username,String password, collectionauthorities,Operators operators) {
this.username = username;
this.password = password;
this.authorities =authorities;this.operators = operators;
this.operators.setPassword(null);
)
...
}

创建一个 MyUserDetailsService服务类,并在配置类SecurityConfiguration中进行引用。这样就可以让Spring Secutiry使用我们定义的用户及其权限进行安全访问控制认证了。具体的实现细节可参考前文的SSO设计。


平台管理后台的权限管理设计

这里的权限管理使用了一种较为简单的方法来实现,即通过使用配置参数实现权限管理,实现方法如下。

首先,在模块的应用配置中增加如下所示的配置项:

securityconfig:
logoutsuccssurl:/
permitall:-/druid/*★- /bbs**
deniedpage:/deny
urlroles:/**/
new/** =admins;
/★*/
edit/**=admins, editors;/**/delete/** =admins

这些配置参数由自定义的一个配置类 SecuritySettings 实现。

其中,urlroles为权限管理的配置参数。这个配置参数通过请求的URL 设定用户的访问权限。这里只设置了两个角色(或者说用户组)的权限,它们分别是admins和editors。在 URL资源配置中,结合通配符“*”,分别使用关键字new、edit 和 delete表示新建、编辑和删除操作。

在控制器的设计中,同样需要使用这些关键字设置URL,例如下面所示的一些@RequestMapping 设计:

@RequestMapping( "/new")
CRequestMapping(value="/edit/{id] ")
@RequestMapping(value="/update",method = RequestMethod.POST)@RequestMapping(value=" /delete/{id} ")

其次,在安全资源管理的元数据管理
CustomSecurityMetadataSource中,使用如下所示的设计:

public CustomsecurityMetadataSource (String urlroles){
super();
this.urlroles =urlroles;
resourceMap = loadResourceMatchAuthority();
private Map<String, Collection>loadResourceMatchAuthority({
Map<String, Collection>map = new HashMap<String,
Collection>(0);
if (urlroles !=null && !urlroles.isEmpty()){
String[] resouces = urlroles.split(";");for(String resource : resouces){
String[]urls = resource.split("=");String[roles = urls[1].split(",");Collection list = new
ArrayList();
for(String role :roles){
ConfigAttribute config =new SecurityConfig (role.trim());list.add (config);
//key: url,value: roles
map.put(urls[0].trim(), list);
}else{
logger.error("'securityconfig.urlroles' must be set");
}
logger.info ( "Loaded UrlRoles Resources. ");return map;
}

这个设计表示,当系统启动时,导入上面权限配置的数据作为安全管理的元数据,给后面的权限检查提供依据。

最后,在权限检查
CustomAccessDecisionManager的设计中,使用如下所示的设计:

public class CustomAccessDecisionManager implements AccessDecisionManager
{
protected Log log = LogFactory.getLog (getClass());
@override
public void decide (Authentication authentication, 0bject object,
CollectionconfigAttributes)

throws AccessDeniedException,InsufficientAuthenticationException tif(configAttributes == null)
{
return;
}
//config urlroles
Iteratoriterator = configAttributes.iterator();
while (iterator.hasNext()){
ConfigAttribute configAttribute = iterator.next();//need role
String needRole = configAttribute.getAttribute();//user roles
for (GrantedAuthority ga : authentication.getAuthorities())I
if (needRole.equals(ga.getAuthority()))
{
return;
}
}
log.info("need role is " + needRole);
}
throw new AccessDeniedException ( "Cannot Access!");
}
}

当用户访问的资源中包含安全管理的元数据时,就检查用户的角色列表中是否有与之匹配的角色,以此达到权限验证的目的。

这种简化的设计要求我们在创建角色时,其名字必须与配置中的名字相匹配,即使用前面配置中的admins和 editors。

如果想要通过数据管理的方式控制权限,实现更加丰富的权限管理功能,则可以参照10.4节中的内容。

在完成上面所有设计后,就可以开始进行测试了。

直接启动manage-web应用,启动成功之后,在浏览中输入如下所示的链接登录系统:

http://localhost:8099

使用前面单元测试时生成的用户名admin即可登录系统。登录系统后可以对操作员及其角色等数据进行管理,如图11-1所示。


本文给大家讲解的内容是平台管理后台与商家菜单资源管理:平台管理后台的访问控制设计

  1. 下篇文章给大家讲解的是平台管理后台与商家菜单资源管理:商家的注册管理设计;

  2. 觉得文章不错的朋友可以转发此文关注小编;

  3. 感谢大家的支持!

本文就是愿天堂没有BUG给大家分享的内容,大家有收获的话可以分享下,想学习更多的话可以到微信公众号里找我,我等你哦。


浏览 16
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报