如何在spring boot中手动验证用户?

时间:2017-06-13 02:19:04

标签: java spring spring-boot spring-security

我有两张桌子'用户'我希望创建一个登录API(例如' / login'),它将用户名和密码作为json数据。我想检查给定的凭证是否是有效的凭证,如果是,那么我想将用户设置为经过身份验证的用户,以便他/她可以拥有受保护的资源。我是Spring Boot框架的新手,我不知道怎么做。我已经阅读了官方文档,但找不到任何资源。有人可以帮我吗?

1 个答案:

答案 0 :(得分:3)

您可以在Spring中实现此类身份验证。

案例1: - 如果您正在构建REST服务,那么您可以通过以下方式实现安全性:

i) - 您可以使用基本身份验证来验证您的用户。

ii) - 您可以使用OAuth2对您的用户进行身份验证和授权。

案例2:如果您正在构建Web应用程序

i) - 您可以使用身份验证令牌(如果是单页应用程序SPA)

ii) - 您可以使用基于会话的身份验证(传统登录表单和所有)

我猜你正处于初学者模式,因此我建议你首先通过登录表格了解网络应用程序中的控制流用户身份验证。所以让我们来看一些代码。

我假设你已经设置了一个基本的spring项目,现在你正在实现安全性。

USER - 用户表的Hibernate实体; ROLE - 角色表的Hibernate实体

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private CustomAuthProvider customAuthProvider;
@Override
protected void configure(HttpSecurity http) throws Exception {
    // everyone is allowed tp view login page
    http.authorizeRequests().antMatchers("/login").permitAll().and();
    http.authorizeRequests().antMatchers("custom_base_path" + "**").authenticated().and().
    formLogin().loginPage("/loginForm).loginProcessingUrl("/loginUser")
            .usernameParameter("username").passwordParameter("password")
            .defaultSuccessUrl("custom_base_path+ "home", true);

@Autowired
public void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception {
    auth.authenticationProvider(customAuthProvider);
}


//CustomAuthProvider
@Component
public class CustomAuthentiationProvider implements AuthenticationProvider{
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
    String userid = authentication.getName();
    String password = authentication.getCredentials().toString();
    Authentication auth = null;
    try {
 //write your custom logic to match username, password
boolean userExists = your_method_that_checks_username_and_password
        if(userExists ){
            List<Role> roleList= roleDao.getRoleList(userid);
            if (roleList == null || roleList.isEmpty()) {
                throw new NoRoleAssignedException("No roles is assigned to "+userid);
            }
            auth = new UsernamePasswordAuthenticationToken(userid, password,getGrantedAuthorities(roleList));
        }
    } catch (Exception e) {
        log.error("error", e);
    }
    return auth;

}

@Override
public boolean supports(Class<?> authentication) {
    return authentication.equals(UsernamePasswordAuthenticationToken.class);
}

public List<GrantedAuthority> getGrantedAuthorities(List<Role> roleList) {
    List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
    for (Role role : roleList) {
        authorities.add(new SimpleGrantedAuthority(role.getRoleName());
    }
    return authorities;
}
}

注意: 请考虑这些代码以了解身份验证的逻辑。不要认为是完美的代码(不适用于生产环境)。你可以随时打电话给我,我会建议你更多。