为自定义userdetailsservice定义bean
具体细节如下:
我在spring
petclinic示例中添加了安全性,作为学习Spring安全性的一种方式。我正在使用Java配置,并设置了一个SecurityConfig.java
扩展文件WebSecurityConfigurerAdapter
。我试图以JdbcAuthentication
一种利用由ClinicService
petclinic示例中内置的工具管理的MySQL数据库的方式进行设置。因此,我创建了一个CustomUserDetailsService
扩展类UserDetailsService
,并打算SecurityConfig.java
与进行链接ClinicService.java
。我创建了一个User
类和一个Role
类来分别对MySQL数据库中的users
和roles
表进行建模。
然后,我添加了以下行business-config.xml
来定义CustomUserDetailService
:
<bean class="org.springframework.samples.petclinic.service.CustomUserDetailsService"></bean>
但是,我仍然收到以下错误,指出尚未为其CustomUserDetailService
定义bean :
Caused by: java.lang.IllegalArgumentException: Can not set org.springframework.samples.petclinic.service.CustomUserDetailsService field
org.springframework.security.samples.petclinic.config.SecurityConfig.myCustomUserDetailsService
to $Proxy61
您可以SecurityConfig.java
通过单击此链接进行阅读。
对于该代码business-
config.xml是在这个环节。
对于该代码CustomUserDetailService.java
是在这个环节。实体
的代码位于此链接上。实体
的代码位于此链接上。
完整的堆栈跟踪可以在此链接上读取。
User
Role
该应用程序的所有其他代码都可以在Spring
petclinic示例的github页面上找到,您可以通过单击此链接阅读。
这是login.jsp的代码链接。
这是我修改后的business-
config.xml代码的链接。
回答:
总结评论,这就是答案。
这里有几处错误:
1)在Spring中以将Java配置导入XML配置文件中的方式混合XML配置和Java配置时,<context:annotation-
config/>需要在xml文件中存在,并且Java配置类需要声明为bean。<context:annotation-
config/>将启用对声明的bean的注释处理,然后将处理@Configuration注释。在文档中了解更多信息:http :
//docs.spring.io/spring/docs/3.2.x/spring-framework-
reference/html/beans.html#beans-java-
combining
要解决此问题,请<context:annotation-config/>
在business-
config.xml中插入。<context:annotation-config/>
需要<bean
class="org.springframework.security.samples.petclinic.config.SecurityConfig"></bean>工作,因此需要在同一bean概要文件中声明它们。
2)您将在SpringConfig中自动装配具体的类(CustomUserDetailsSerivce),而不是接口(UserDetailsService)。虽然可以使用Spring自动连接具体类,但通常最好将其自动连接到接口(Spring将自动将CreateUserUserDetailsSerivce实现连接到@Autowired
UserDetailsService字段)。Spring围绕有线类创建代理以启用某些功能(例如声明性事务),并且这些代理在自动装配时可以轻松实现接口,但是如果尝试自动装配到具体类中则可能会失败。尽管有可能实现它-
更多信息,请参见:Spring
Autowiring类与接口?
在这种情况下,最好自动连接到UserDetailsService接口,因为这实际上是我们的安全配置所依赖的。
要解决此问题,请在SpringConfig中将字段类型指定为UserDetailsService:
//Use UseDetailsService interface as field type instead of concrete class CustomUserDao@Autowired
private UserDetailsService myCustomUserDetailsService;
3)您似乎正在同时设置jdbc身份验证和使用自定义用户详细信息服务的身份验证。如果您希望Spring
Security使用jdbc查询数据库并查找有关现有用户及其角色等信息,通常会使用Spring
JDBC身份验证。如果您想实现对用户/角色等的查询,请使用Custom
UserDetailsSerivce。在您的示例中(因为您提供了自定义UserDetailsService,它将使用ClinicService查询后端),因此不需要JDBC身份验证。
这是一个使用spring自定义安全性配置的示例,该配置通过java
config使用自定义UserDetailsService(在其他地方实现并由spring自动装配):
@Configuration@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/petclinic/")
.usernameParameter("j_username") // default is username
.passwordParameter("j_password") // default is password
.loginProcessingUrl("/j_spring_security_check") // default is /login with an HTTP post
.failureUrl("/login")
.permitAll()
.and()
.logout()
.logoutSuccessUrl("/index.jsp")
.and()
.authorizeRequests()
.antMatchers("/**").hasRole("ROLE_ADMIN")
.antMatchers("/j_spring_security_check").permitAll()
.and()
.userDetailsService(userDetailsService);
}
}
- 我建议您阅读实际文档,因为它描述了特定的配置构建器方法做什么并提供了示例:[http](http://docs.spring.io/spring-
- security/site/docs/3.2.0.RC2/apidocs/org/springframework/security/config/annotation/web/builders/HttpSecurity.html#formLogin())
- //docs.spring.io/spring-
security/site/docs/3.2.0.RC2/apidocs/org/springframework/ security / config /
annotation / web / builders /
HttpSecurity.html#formLogin()
编辑1-添加了登录表单配置并链接到文档
编辑2-为问题1添加了更多说明)
编辑3-将角色名称形式从“ ADMIN”更改为“ ROLE_ADMiN”以匹配UserDetailsService中的角色名称
以上是 为自定义userdetailsservice定义bean 的全部内容, 来源链接: utcz.com/qa/428941.html