与Shiro一起设置

本节介绍如何将SecMan设置和配置为权威人士,带有框架Shiro集成被用作身份验证器.

它支持的主要用例是通过外部机制(例如LDAP)执行身份验证。这是通过SecMan的shiro领域子模块实现的,该子模块提供了Apache shiro的王国接口,然后调用回SecMan。

本地身份验证

下图描绘了高层架构:

具有Shiro本地身份验证的SecMan

塞克曼·希罗建筑.drawio

因此:

  • 阿帕奇堤道Shiro安全集成设置Shiro网络过滤器来拦截每个http请求,以及验证者Shiro实施。

  • 这个身份验证器Shiro调用Shiro安全管理器以获取经过身份验证的主体。

  • Shiro安全管理器使用shiro.ini公司配置文件以查找域以执行身份验证;在本例中,我们将其配置为使用塞克曼的领域(堤道模块ExtSecmanShiroRealm).

  • Secman的领域实现查询数据库并使用它创建应用程序用户的主体,其中负责人界面是Shiro对经过身份验证的用户的表示。这个应用程序用户的主体由支持应用程序用户,为该特定用户提供对象成员的所有权限。

  • 为了呈现页面,Apache Causeway查看器使用配置的权威人士,在这种情况下塞克曼自己的AuthorizorSecman公司.这将查找当前应用程序用户(它已经驻留在内存中)并根据对象成员是否可见来呈现页面。

上述配置允许使用Secman对用户进行身份验证;密码存储为应用程序用户.根据应用程序用户帐户类型属性。

委托身份验证

如前一节所述,本地身份验证实际上并没有完成多少工作;尽管Shiro是身份验证器实现正在使用中,因为Shiro Realm只是查询SecMan数据库,与简单使用SecMan自己的数据库没有什么真正的区别身份验证器实施。

事情变得更加有趣和有用的地方是塞克曼的领域实施还允许查询另一个“委托”领域(例如LDAP)。在这种情况下,Shiro可以获得由委托领域而不是本地执行的“委托”用户身份验证。

下图显示了此委托发生的位置:

具有Shiro代理身份验证的SecMan

塞克曼·希罗代表架构.drawio

配置委托领域时应用程序用户实体可以在SecMan数据库中为外部用户自动创建。可以根据需要配置Secman,以便这些用户在默认情况下被锁定或解锁,请参阅在下面.

依赖关系

除了常规依赖项塞克曼要求,也添加到塞克曼的Shiro Realm实现中:

pom.xml(pom.xml)
<依赖项><依赖性><groupId>org.apache.couseway.extensions</groupId><artifactId>堤道延伸段-secman-persistence-XXX(1)</依赖性><依赖性><groupId>org.apache.couseway.extensions</groupId><artifactId>堤道扩展-secman加密-jbcrypt(2)</依赖性><依赖性>org.apache.causeway.extensions<artifactId>堤道延伸线-secman-delegated-shiro</依赖性></依赖项>
1 指定其中之一堤道延伸-塞克曼-persistence-jpa堤道延伸段,根据需要
2 提供了密码加密服务

更新AppManifest

除了其他模块Secman要求添加到您的应用程序应用程序清单,还添加了:您还需要导入夹具模块;SecMan使用fixture脚本为其实体设定种子:

应用清单.java
@配置@导入({...堤道模块ExtSecmanRealmShiro.class,(1)...})公共类AppManifest{}
1 启用Shiro集成(以便Shiro委托给Secman进行身份验证)。

这带来了对堤道模块安全Shiro模块。

确保没有其他铜锣路模块安全Xxx模块导入到AppManifest中。

Shiro(代表)王国

SecMan的Shiro领域使用shiro.ini公司文件。以下设置Shiro没有委托:

shiro.ini公司
[主要]authenticationStrategy=org.apache.cocauseway.extensions.secman.delegated.shiro.realm。SecMan认证策略casewayModuleSecurityRealm=org.apache.causeway.extensions.secman.delegated.shiro.realm。堤道模块ExtSecmanShiroRealmsecurityManager.authenticator.authenticationStrategy=$authenticationStrategsecurityManager.realms=$casewayModuleSecurityRealm[用户][角色]

这个[用户][角色]节是必需的,但未使用。

不过,引入Shiro的主要目的是通过外部机制(如LDAP)引入对身份验证的支持。在本例中,我们将Shiro配置为使用外部领域作为主要领域,而Secman的Shiro领域设置为“委托”领域。我们在shiro.ini公司文件,并将其“注入”到Secman领域。

例如,使用Shiro的LDAP领域作为代表:

shiro.ini公司
[主要]...contextFactory=org.apache.shiro.realm.ldap。JndiLdap上下文工厂(1)contextFactory.url=ldap://localhost:10389(2)contextFactory。systemUsername=uid=admin,ou=系统contextFactory.systemPassword=机密contextFactory.authenticationMechanism=CRAM-MD5ldapRealm=org.apache.shiro.realm.ldap。默认LdapRealm(3)ldapRealm.contextFactory=$contextFactorcasewayModuleSecurityRealm.delegateAuthenticationRealm=$ldapRealm(4)...
1 实例化JNDI LDAP上下文
2 …已配置凭据以查询用户
实例化LDAP领域
4 指定LDAP领域作为SecMan自己领域的委托领域。

然后应该在LDAP服务器中适当地定义用户。例如,如果使用阿帕奇DS服务器:

  • 用户存储在SASL下搜索BaseDn属性

    对于ApacheDS 1.5.7,可以在服务器.xml文件):

  • 可以定义为inetOrg人员使用液体用户密码定义凭据:

    060创建inetOrgPerson

通过此配置,用户/密码在LDAP中定义,而其用户权限则从SecMan中定义的用户/组/权限中获取。

更简单的LDAP配置

事实上,只需将Shiro配置为使用LDAP领域,而根本不定义secman领域,也可以简化问题。

例如:

shiro.ini公司
[主要]contextFactory=org.apache.shiro.realm.ldap。JndiLdap上下文工厂contextFactory.url=ldap://localhost:10389contextFactory.systemUsername=uid=admin,ou=systemcontextFactory.systemPassword=机密contextFactory.authenticationMechanism=CRAM-MD5ldapRealm=org.apache.shiro.realm.ldap。默认LdapRealmldapRealm.contextFactory=$contextFactorsecurityManager.relegis=$ldapRealm

虽然更简单,但这种方法的关键区别在于它不会自动创建应用程序用户在塞克曼内部;它们必须通过某种单独的方式创建。如果LDAP中有条目,但secman中没有条目,则最终用户可以“登录”,但不能访问任何功能。

配置属性

如简介中所述,如果设置了委托身份验证,这意味着身份验证可能会传递给Secman一无所知的用户。在这种情况下,Secman将自动创建一个应用程序用户对于此外部委托的已验证用户,类型设置为“delegated”。

我们可以配置此类自动创建的帐户在默认情况下是否应解锁或锁定:

应用程序.yml
堤道:扩展名:塞克曼:委派的用户:自动创建策略:auto_create_AS_LOCKED