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

时间:2010-02-23 13:34:58

标签: spring jpa spring-security

我正在使用Hibernate 3(带JPA Annotations),Spring 2.5和Spring Security 2.0.5构建应用程序。

我想知道我需要在spring安全配置文件(applicationContext-security.xml)中放入<authentication-provider>标记,以便我可以让Spring Security使用我现有的Service层类(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);;

但我想使用自己的域对象,这些对象与上面的表定义不同。

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

谢谢!

3 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:1)

使用AutenticationManager定义自定义<bean id="myAuthenticationManager" class="com.security.MyAuthunticationManager"/>MyAutenticationManager类应实现org.springframework.security.AuthenticationManager并覆盖您将使用自定义服务的方法authenticate(Authentication authentication)域对象,用于验证用户凭据并将其角色添加到身份验证对象。

答案 2 :(得分:1)

执行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,你的架构需要工作。