如何通过数据库的LDAP和基于角色的授权实现Spring安全?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过数据库的LDAP和基于角色的授权实现Spring安全?相关的知识,希望对你有一定的参考价值。

我在一个Spring MVC Thymeleaf项目中工作,在这个项目中,带有数据库和基于角色的授权的LDAP安全是终端用户必须具备的要求。

我需要的是

  • 主要认证应该由LDAP执行
  • 用户角色和授予的权限必须与LDAP用户名一起在数据库中配置。
example: 
LDAP user: nahid@test.com
Role: Admin
Granted Authorities for "Admin" role: permission_x,permission_y etc

这将在网页中使用 "hasAuthority("permission_x")"

  • LDAP认证后,系统会检查数据库中是否存在白名单用户。
  • 在白名单检查后,将为用户加载角色和权限,并对加载的权限(不是角色)进行授权。

我找到的是这里。

现在我的问题是。

  1. 我需要把LDAP密码和LDAP用户名一起存储吗?如果需要,它安全吗?
  2. 有没有针对上述情况的例子?
  3. 对于LDAP用户,细粒度的授权能不能用?

LDAP认证和基于jdbc的授权如何协同工作?

先谢谢你

答案

既然我已经找到了解决方案,我在这里分享我自己的答案。希望能帮助到其他人。

我的答案是:

  1. 没有密码需要存储在数据库中。
  2. 不完全是
  3. 是的,细粒度的授权对LDAP用户来说是完美的。

我是如何解决我的问题的。

第一步

诀窍是用一个 UserDetailsContextMapper用户详情 由经常性的 用户详情服务.

例如,在LDAP认证成功后,它将尝试将有效的注册用户加载到具有所有授权的上下文中。

 @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .ldapAuthentication()
                .userDetailsContextMapper(userDetailsContextMapper())
                .userDnPatterns("uid={0},ou=people")
                .groupSearchBase("ou=groups")
                .contextSource()
                .url("ldap://localhost:8389/dc=springframework,dc=org")
                .and()
                .passwordCompare()
                .passwordEncoder(new BCryptPasswordEncoder())
                .passwordAttribute("userPassword");
    }


 @Bean
    public UserDetailsContextMapper userDetailsContextMapper() {
        return new LdapUserDetailsMapper() {
            @Override
            public UserDetails mapUserFromContext(DirContextOperations ctx, String username, Collection<? extends GrantedAuthority> authorities) {
                UserDetails details= userDetailsService.loadUserByUsername(username+"@test.com");
                return  details;
            }
        };
    }

在LDAP认证成功后,它将尝试加载有效的注册用户到上下文中,并授予所有的权限。

第二步

有权 对我没用。我已经用了类似下面的东西。

<div sec:authorize="hasRole('SOME_PRIVILEGE')">
            <div class="alert alert-success" role="alert">
                This is secret DIV
            </div>
        </div>

为了快速检查,你可以用下面的方法。

<span sec:authentication="principal.authorities"></span>

我希望有一天它能帮到你。

编码快乐!

编辑。对于LDAP通过SSL和Spring Boot

以上是关于如何通过数据库的LDAP和基于角色的授权实现Spring安全?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Ldap 进行春季授权和角色管理

如何使用带有 LDAP 身份验证的 Apache Shiro 添加角色授权

LDAP 授权

如何通过 ldap 身份验证和授权将安全性应用于登录流程?

如何在 AngularJS 中处理基于角色的授权?

Apache shiro:使用 ldap 进行用户身份验证,使用数据库获得角色/权限?