我正在使用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);;
但我想使用自己的域对象,这些对象与上面的表定义不同。
有人可以指点我这里正确的方向吗?我找不到任何有用的文档,我不确定我想做的事情是否真的可行。
谢谢!
答案 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,你的架构需要工作。