Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我可以通过自定义方法对用户进行身份验证吗?_Java_Spring_Spring Mvc_Spring Security - Fatal编程技术网

Java 我可以通过自定义方法对用户进行身份验证吗?

Java 我可以通过自定义方法对用户进行身份验证吗?,java,spring,spring-mvc,spring-security,Java,Spring,Spring Mvc,Spring Security,目前,一个应用程序使用spring安全性,通过spring自动生成的登录表单处理简单的用户名和密码。用户名是有效的电子邮件地址 我还有其他代码,它向用户发送一封带有url中会话id的电子邮件,以验证电子邮件地址。这还会向用户发送一条带有自定义pin码的短信,以验证其电话号码。注册站点、验证电子邮件和验证电话号码的步骤需要几个控制器方法和步骤 是否有一种快速简便的方法向现有控制器方法添加代码,该方法只需将用户声明为已登录?这将使用现有的spring安全配置,并通过将用户声明为已登录来简单地进行扩充

目前,一个应用程序使用spring安全性,通过spring自动生成的登录表单处理简单的用户名和密码。用户名是有效的电子邮件地址

我还有其他代码,它向用户发送一封带有url中会话id的电子邮件,以验证电子邮件地址。这还会向用户发送一条带有自定义pin码的短信,以验证其电话号码。注册站点、验证电子邮件和验证电话号码的步骤需要几个控制器方法和步骤

是否有一种快速简便的方法向现有控制器方法添加代码,该方法只需将用户声明为已登录?这将使用现有的spring安全配置,并通过将用户声明为已登录来简单地进行扩充

例如,在控制器方法中:

//confirmed email
//confirmed phone number
//confirmed password
loggedin = true;

澄清:


每次用户登录时,都需要发送并验证确认文本pin码和确认电子邮件。如果无法使用简单的编程语句登录用户,我至少可以使用简单的编程语句更改用户的角色吗?因此,他们使用用户名和密码登录到有限的、有条件的状态,并被分配“StepOneRole”。然后他们验证发送给他们的pin码,并获得“StepTwoRole”。然后,他们验证发送给他们的电子邮件链接,他们的角色更改为“FullUser”,在其中他们可以实际使用站点的安全部分

我试图避免增加不必要的复杂性,但用户每次都需要验证n个因素

另外,请注意,我的
SecurityConfig.java
如下所示,并使用
UserDetailService
,这在下面的一个答案中提到:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.servlet.configuration.EnableWebMvcSecurity;
import org.springframework.security.core.userdetails.UserDetailsService;

@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
private UserDetailsService userDetailsService;

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .csrf().disable()
        .formLogin()
            .loginPage("/login")
            .defaultSuccessUrl("/user-home")
            .usernameParameter("j_username")
            .passwordParameter("j_password")
            .loginProcessingUrl("/j_spring_security_check")
            .failureUrl("/login")
            .permitAll()
            .and()
        .logout()
            .logoutUrl("/logout")
            .logoutSuccessUrl("/login")
            .and()
        .authorizeRequests()
            .antMatchers("/user-home").hasAuthority("USER")
            .antMatchers("/j_spring_security_check").permitAll()
            .and()
        .userDetailsService(userDetailsService);

}

}

如果您想要更多参数来spring安全性登录,那么就不需要快速简单的方法,但也没那么糟糕

Spring security允许您在决定是否登录或返回登录失败状态时决定所需的任何内容。当您单击电子邮件链接/文本代码等进行更新时,数据库中的确认电子邮件、电话是我为用户设置的标志

您的登录表单将使用用户/密码组合,但您也可以告诉spring security验证手机/电子邮件等的标志是否正确,或返回失败状态

而不仅仅是使用spring security提供的默认用户名/密码/角色身份验证提供程序;您可以修改和覆盖UserDetailsService和UserDetails类,并根据需要实现它们,而不是默认的spring安全性

例如:我使用自定义UserDetails服务不仅查看我的用户名,还验证其状态是否为active(因此,以禁用或非活动帐户登录将返回spring登录错误)

通过spring security.xml(如果通过.xml完成,则将spring设置放在任何位置)

}


userService.getUsers(username)将是您想要的任何服务/sql。在我的情况下,它会在我的数据库中查找匹配的用户名,如果帐户状态为活动状态或返回错误,则spring将不允许您登录。如果所有内容都匹配,则会自动登录(密码太明显,您甚至可以通过spring对其进行加密/读取).

如果您想要更多参数来spring安全性登录,则不需要快速简单的方法,但也没有那么糟糕

Spring security允许您在决定是否登录或返回登录失败状态时决定所需的任何内容。当您单击电子邮件链接/文本代码等进行更新时,数据库中的确认电子邮件、电话是我为用户设置的标志

您的登录表单将使用用户/密码组合,但您也可以告诉spring security验证手机/电子邮件等的标志是否正确,或返回失败状态

您可以修改和覆盖UserDetailsService和UserDetails类,而不是使用spring安全性提供的默认用户名/密码/角色身份验证提供程序,并按照您的意愿实现它们,而不是使用默认的spring安全性

例如:我使用自定义UserDetails服务不仅查看我的用户名,还验证其状态是否为active(因此,以禁用或非活动帐户登录将返回spring登录错误)

通过spring security.xml(如果通过.xml完成,则将spring设置放在任何位置)

}


userService.getUsers(username)将是您想要的任何服务/sql。在我的情况下,它会在我的数据库中查找匹配的用户名,如果帐户状态为活动状态或返回错误,则spring将不允许您登录。如果所有内容都匹配,则会自动登录(密码太明显,您甚至可以通过spring对其进行加密/读取).

如果您想要更多参数来spring安全性登录,则不需要快速简单的方法,但也没有那么糟糕

Spring security允许您在决定是否登录或返回登录失败状态时决定所需的任何内容。当您单击电子邮件链接/文本代码等进行更新时,数据库中的确认电子邮件、电话是我为用户设置的标志

您的登录表单将使用用户/密码组合,但您也可以告诉spring security验证手机/电子邮件等的标志是否正确,或返回失败状态

您可以修改和覆盖UserDetailsService和UserDetails类,而不是使用spring安全性提供的默认用户名/密码/角色身份验证提供程序,并按照您的意愿实现它们,而不是使用默认的spring安全性

例如:我使用自定义UserDetails服务不仅查看我的用户名,还验证其状态是否为active(因此,以禁用或非活动帐户登录将返回spring登录错误)

通过spring security.xml(如果通过.xml完成,则将spring设置放在任何位置)

}

getUsers(用户名)将是您想要的任何服务/sql。在我的ca中
<authentication-manager>
    <authentication-provider ref="authProvider"/>
</authentication-manager>
<beans:bean id="authProvider" 
    class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
    <beans:property name="userDetailsService" ref="customProvider"/>
</beans:bean>
<beans:bean id="customProvider" 
    class="com.asura.projectX.authentication.CustomAuthenticationProvider">
</beans:bean>
public class CustomAuthenticationProvider implements UserDetailsService{

@Inject
private UserService userService; 

@Override
public UserDetails loadUserByUsername(String username)
        throws UsernameNotFoundException {
    Users user=userService.getUsers(username);
    if(user==null) throw new UsernameNotFoundException("Username not found");
    return user;
}
    Authentication authentication =
        new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities());
    SecurityContextHolder.getContext().setAuthentication(authentication);
SecurityContextHolder.getContext().setAuthentication(null);
public class UserDetailsImpl implements UserDetails {


    private static final long serialVersionUID = 5197941260523577515L;

    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public UserDetailsImpl(User user) {
        this.user = user;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {

        Collection<GrantedAuthority> authorities = new HashSet<GrantedAuthority>(
                user.getRoles().size() + 1);

        for (Role role : user.getRoles())
            authorities.add(new SimpleGrantedAuthority("ROLE_" + role.name()));

        authorities.add(new SimpleGrantedAuthority("ROLE_USER"));

        return authorities;

    }

    @Override
    public String getPassword() {
        return user.getPassword();
    }

    @Override
    public String getUsername() {
        return user.getEmail();
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }

}
UserDetailsImpl userDetails = new UserDetailsImpl(user);

Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication);