ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java-为自定义userdetailsservice定义bean

2019-10-10 03:01:11  阅读:13  来源: 互联网

标签:java spring spring-mvc spring-security



如何定义自定义UserDetailsS​​ervice Bean,以使Spring MVC Web应用程序能够使用基础MySQL数据库检查用户和密码的身份验证?

具体细节如下:

我正在向春季宠物诊所样本添加安全性,作为学习春季安全性的一种方式.我正在使用Java配置,并设置了扩展WebSecurityConfigurerAdapter的SecurityConfig.java文件.我试图以一种利用由Petclinic示例内置的ClinicService工具管理的MySQL数据库的方式来设置JdbcAuthentication.因此,我创建了一个CustomUserDetailsS​​ervice类,该类扩展了UserDetailsS​​ervice,并旨在将SecurityConfig.java与ClinicService.java链接.我创建了一个User类和Role类来分别对MySQL数据库中的用户表和角色表进行建模.

然后,将以下行添加到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 by clicking on this link.
business-config.xml的代码为at this link.
CustomUserDetailService.java的代码是at this link.
用户实体的代码是at this link.
角色实体的代码为at this link.
完整的堆栈跟踪可以读取at this link.

该应用程序的所有其他代码都可以在Spring petclinic示例的github页上找到,您可以阅读by clicking on this link.

这是a link to the code for login.jsp.

这是a link to my revised business-config.xml code.

解决方法:

总结评论,这就是答案.

这里有几处错误:

1)在Spring中以将Java配置导入XML配置文件的方式混合XML配置和Java配置时,< context:annotation-config />需要存在于xml文件中,并且java config类需要声明为bean. &LT上下文:注解的配置/&GT将启用对声明的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中. &LT上下文:注解的配置/&GT < bean class =“ org.springframework.security.samples.petclinic.config.SecurityConfig”>< / bean>要正常工作,因此需要在同一bean概要文件中声明它们.

2)您将在SpringConfig中自动装配具体的类(CustomUserDetailsS​​erivce),而不是接口(UserDetailsS​​ervice).虽然可以使用Spring自动连接具体类,但通常最好将其自动连接到接口(Spring将自动将CreateUserUserDetailsS​​erivce实现连接到@Autowired UserDetailsS​​ervice字段). Spring围绕有线类创建代理以启用某些功能(例如声明性事务),并且这些代理在自动装配时可以轻松实现接口,但是如果尝试自动装配到具体类中则可能会失败.尽管有可能实现它-在此处获取更多信息:Spring Autowiring class vs. interface?
在这种情况下,最好自动连接到UserDetailsS​​ervice接口,因为这实际上是我们的安全配置所依赖的.

要解决此问题,请在SpringConfig中将字段类型指定为UserDetailsS​​ervice:

//Use UseDetailsService interface as field type instead of concrete class CustomUserDao
@Autowired
private UserDetailsService myCustomUserDetailsService;

3)您似乎正在同时设置jdbc身份验证和使用自定义用户详细信息服务的身份验证.如果您希望Spring Security使用jdbc查询数据库并查找有关现有用户及其角色等信息,通常会使用Spring JDBC身份验证.如果您想实现对用户/角色等的查询,请使用Custom UserDetailsS​​erivce.在您的示例中(因为您提供了自定义UserDetailsS​​ervice,它将使用ClinicService查询后端),因此不需要JDBC身份验证.

这是一个使用spring自定义安全性配置的示例,该配置通过java config使用自定义UserDetailsS​​ervice(在其他地方实现并由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://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”以匹配UserDetailsS​​ervice中的角色名称



标签:java,spring,spring-mvc,spring-security

专注分享技术,共同学习,共同进步。侵权联系[admin#icode9.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有