2017-10-10 113 views
3

在我的Spring Boot应用程序中,我正在使用Auth0来管理对其余api的访问。
除了Auth0的scope我想为每个用户添加一个ROLE,这反过来将提供一个额外的访问控制层,其中低特权用户将无法访问特定的API。在弹簧安全性/ Auth0授权中添加'ROLE'

我一直在阅读关于自定义规则和授权扩展,但不能完全理解什么是适合我的正确实现。

这里是我WebSecurityConfigurerAdapter代码片段:
所以基本上我想只有“管理员”例如,以能够访问/test/**

@Override 
    protected void configure(HttpSecurity http) throws Exception { 
     JwtWebSecurityConfigurer 
       .forRS256(configBean.getAuth0ApiAudience(), configBean.getAuth0Issuer()) 
       .configure(http) 
       .authorizeRequests() 
       .antMatchers(HttpMethod.GET, "/test/**").hasAuthority("read:test") 
       .anyRequest().authenticated(); 
    } 

任何帮助,将不胜感激!

回答

3

你在这里有几个选项(至少..)。

1)。你可以想象用一个规则来处理决定逻辑,其中“角色”被分配给给定的用户 - 而不是将其标记到scope(你也可以这样做),你可以决定它们属于custom claim该访问令牌。规则的身体可能包含类似

// lookup the permissions for given user somehow (secured webhook, static map etc) - here lets imagine we want ROLE_USER assigned 

context.accessToken.scope = "ROLE_USER" 
// or 
context.accessToken['https://mydomain/roles'] = "ROLE_USER" 

2)。只需使用auth0访问令牌中提供的auth0用户标识(可将其发送到API),您就可以使用这些知识查找Auth0的“超出带宽”使用的更细粒度的权限(使用您的自己的数据库存储用于在用户Id等等上键入的权限或者在访问令牌上标记的某些其他客户声明 - 或者,例如,如果您将ROLE信息标记为元数据到Auth0用户配置文件,则可以使用auth0然后可以执行Auth0用户配置文件查找(管理api),并以此方式获取详细信息,请参阅example here以获取Java中关于从JWT访问令牌获取userId声明的说明(如果您喜欢此方法)

3)。看看Auth0 authorization extension,通过组,角色和权限为用户授权提供支持。您可以在登录过程中定义预期行为,并且您的配置设置将在运行时执行的规则中捕获。

这里没有硬性和快速的答案,每个上述优点考虑,以及您的项目需要什么。如果您真的想要按照上面的代码利用现有的声明性授权,那么选项1,并且将ROLES信息挂钩到scope是最简单的方法。

但是,我会主张选项2)。对于大多数“务实”的中小型企业来说,这是我自己之上的事情。在这里,您需要在您的Controller端点中使用一些编程代码来查找ROLES,然后以此方式做出安全决策。您也可以将查找代码推送到通用的自定义过滤器中,该自定义过滤器在达到Controller代码之前执行,并以这种方式执行必要的Spring Security操作 - 更多高级开发人员选项 - (我过去编写过支持此操作的库Spring Boot/Security的方法 - 因此可以证明这是一个合理的方法,请参阅here for demonstration,但是,确定你更喜欢继续构建业务逻辑,而不是绕道去建立一个库,对不对?)。选项3)。如果你正在构建一个严肃的企业应用程序,并且需要所有的集成 - 特别是在与企业连接(如Active Directory)集成的情况下,这一点非常值得探索。

如果您仍然困惑,留下我的评论,但希望以上提供足够的见解进一步探索。

快速更新

而且我们的讨论,这里是一个小规则,让你你问的想法:

function addRoleScopesToAccessToken(user, context, callback) { 
    console.log("add-role-scopes-to-access-token rule"); 
    user.app_metadata = user.app_metadata || {}; 
    var roles = user.app_metadata.roles; 
    if (roles && roles.length > 0) { 
    context.accessToken.scope = roles.join(' '); 
    } 
    callback(null, user, context); 
} 

这该是多么的“app_metadata”看起来像:

{ 
    "roles": [ 
    "role1", 
    "role2" 
    ] 
} 

你应该与添加到scope角色一个JWT访问令牌结束。例如。

enter image description here

+0

谢谢您的详细信息。 所以说我去选择#2,因为我已经写我的角色Auth0的自定义元数据 - 弹簧安全将如何拒绝访问基于此? – Killyz

+0

嗨,我更新了上面的答案 - 请参阅我关于选项1和选项2的观点。选项1将为您提供现成代码/弹簧引导配置享有的声明式“范围”检查支持。选项2将需要更多的工作 - 您可以将其作为自定义过滤器或控制器本身。 – arcseldon

+0

刚刚添加了一些评论和一个链接到一个旧的Auth0库 - 一个我在2016年写过,因为v1已经取代。 – arcseldon