如何使用 Hibernate 3 Annotated Classes 配置 Spring Security 2 数据库身份验证?

Posted

技术标签:

【中文标题】如何使用 Hibernate 3 Annotated Classes 配置 Spring Security 2 数据库身份验证?【英文标题】:How do I configure Spring Security 2 database authentication with Hibernate 3 Annotated Classes? 【发布时间】:2011-01-20 01:56:30 【问题描述】:

我正在使用 Hibernate 3(带有 JPA 注释)、Spring 2.5 和 Spring Security 2.0.5 构建一个应用程序。

我想知道我需要在我的 Spring Security 配置文件 (applicationContext-security.xml) 中的 <authentication-provider> 标签中添加什么,以便我可以让 Spring Security 使用我现有的服务层类 (AuthenticationService)使用我的自定义用户和角色域对象。

我了解 Spring Security 需要两个具有以下架构的表:

     create table users(
      username varchar_ignorecase(50) not null primary key,
      password varchar_ignorecase(50) not null,
      enabled boolean not null);

  create table authorities (
      username varchar_ignorecase(50) not null,
      authority varchar_ignorecase(50) not null,
      constraint fk_authorities_users foreign key(username) references users(username));

  create unique index ix_auth_username on authorities (username,authority);;

但我想使用我自己的与上述表格定义不同的域对象。

有人可以在这里为我指出正确的方向吗?我找不到任何有用的文档,我不确定我想做的事情是否真的可行。

谢谢!

【问题讨论】:

【参考方案1】:

您可以实现自定义 UserDetailsService 作为您的域和 Spring Security 之间的桥梁。然后按如下方式提供 Spring Security(对于 Spring Security 2.x):

<security:authentication-provider user-service-ref='myUserDetailsService'/>

<bean id="myUserDetailsService" class="... your implementation ...">
    ...
</bean>

【讨论】:

【参考方案2】:

使用&lt;bean id="myAuthenticationManager" class="com.security.MyAuthunticationManager"/&gt; 定义您的自定义AutenticationManagerMyAutenticationManager 类应实现org.springframework.security.AuthenticationManager 并覆盖方法authenticate(Authentication authentication),您将在其中使用您的自定义服务和域对象来验证用户凭据并添加他的身份验证对象的角色。

【讨论】:

这太过分了。自定义 UserDetailsS​​ervice 就足够了。【参考方案3】:

按照 axtavt 所说的去做,或者如果您不需要任何其他操作,只需点击自定义表,您可以覆盖查询:

<security:authentication-provider>
     <jdbc-user-service data-source-ref="dataSource" 
        authorities-by-username-query="SELECT u.username, a.authority FROM users u, authorities a WHERE u.username = a.username AND u.username = ?" />
        users-by-username-query="SELECT username, password, enabled FROM users WHERE username = ?" />
</security:authentication-provider>

不过,我会按照 axtavt 的建议去做。您可以创建一个实现 Spring Security User 对象的 DTO(数据传输对象)。这将允许您在从 SecurityContextHolder 检索用户时访问相关数据:

Object o = SecurityContextHolder.getContext().getAuthentication().getDetails();
UserDetailsDTO u = (UserDetailsDTO) o;
User user = u.getUser();
// now you have primary key, etc., etc.

您现在确实不需要查看您的表,但是 IMO,您的架构需要工作。

【讨论】:

以上是关于如何使用 Hibernate 3 Annotated Classes 配置 Spring Security 2 数据库身份验证?的主要内容,如果未能解决你的问题,请参考以下文章

Django:仅使用 annotate() 和 values() 计算非空 CharField

aggregate和annotate使用

matplotlib-- legend(图例说明解释),annotate(标注),text(标注)

072:Django数据库ORM聚合函数详解-aggregate和annotate

使用 annotate() 包含一个 django 模型对象属性

ggplot / ggpubr:导出绘图时忽略annotate_figure