Spring Security Ant Matchers for home root / - spring boot 1.4.2发布版

时间:2016-11-22 03:17:57

标签: spring spring-security spring-boot

当用户点击http://localhost:8080时,我需要通过spring security显示基于自定义的登录表单(/auth/login.html)。如果用户使用admin角色成功登录,请将用户重定向到/admin/adminsuccess.html。管理员用户重定向到/adminsuccess.html后,我需要允许管理员用户访问其他网页,例如(/admin/assetallocate.html,/admin/assetdeallocate.html..)如果用户未使用admin角色登录,请显示包含错误的相同登录页面。

以下是我的代码:

 @Configuration
    public class AssetWebConfig extends WebMvcConfigurerAdapter {

        @Override
        public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/login").setViewName("auth/login");
        registry.addViewController("/admin/adminsuccess").setViewName("admin/auth-success");
        registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
    }

    }

    @Configuration
    @EnableWebSecurity
    @Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
        .authorizeRequests()
        .antMatchers("/login").permitAll()
        .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')") 
        .antMatchers("/**").access("hasRole('ROLE_ADMIN')")
            .and()
        .formLogin()
            .loginPage("/login")
            .usernameParameter("username")
            .passwordParameter("password")
            .defaultSuccessUrl("/admin/adminsuccess")
            .and()
        .logout()
            .logoutSuccessUrl("/login?logout")
            .permitAll()
            .and()
            .csrf().disable();
}

}

/auth/login.html
    <form name="loginform" th:action="@{/login}" method="post" class="form-signin">

以上代码无论我写的是什么都没有按预期工作。这可能是ant匹配模式的问题。请指导。

更新: 当我点击&#34; http://localhost:8080&#34;时,现在会显示自定义登录页面。但是,当我输入正确的凭据时,它不会重定向查看名称&#39; /admin/auth-success.html'基于AssetWebConfig.java配置。如果我输入正确的凭证,则下面是当前的响应。

This application has no explicit mapping for /error, so you are seeing this as a fallback.
Wed Nov 23 11:42:59 IST 2016
There was an unexpected error (type=Not Found, status=404).
No message available

1 个答案:

答案 0 :(得分:0)

是。问题出在您的蚂蚁匹配器上。

根据我的理解,当您说 anyRequest.permitAll 时,它不符合 antMatchers(&#34; / admin / *&#34;)。 (&#34; hasRole(&#39; ROLE_ADMIN&#39;)&#34) 因为您要告知网络安全,以便在未经授权的情况下允许每个请求通过。

更改如下,

.antMatchers("/login").permitAll()
.antMatchers("/admin/**").access("hasRole('ADMIN')")
.antMatchers("/**").access("hasRole('USER')")
.and()
.formLogin().loginPage("/login")
.usernameParameter("username")
.passwordParameter("password")
.defaultSuccessUrl("/index")
.failureUrl("/login?error");

https://github.com/satya-j/rab/blob/master/src/main/java/com/satya/rab/config/WebSecurityConfig.java - 参考这个,这是我之前用弹簧安检试过的回购。

编辑:

这是更新

<强> WebSecurityConfig

@Component("authProvider")
public class CustomAuthenticationProvider implements AuthenticationProvider     {

@Override
public Authentication authenticate(Authentication auth) throws AuthenticationException {
    String username = auth.getName();
    String password = auth.getCredentials().toString();

    if(username.equals("user") && password.equals("user")) {
        List<GrantedAuthority> grantedAuths = new ArrayList<GrantedAuthority>();
        grantedAuths.add(new SimpleGrantedAuthority("ROLE_USER"));
        return new UsernamePasswordAuthenticationToken(username, password, grantedAuths);
    } else if(username.equals("admin") && password.equals("admin")) {
        List<GrantedAuthority> grantedAuths = new ArrayList<GrantedAuthority>();
        grantedAuths.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
        grantedAuths.add(new SimpleGrantedAuthority("ROLE_USER"));
        return new UsernamePasswordAuthenticationToken(username, password, grantedAuths);
    } else {
        throw new CustomException("Unable to auth against third party systems");
    }
}

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

您可以使用您选择的身份验证提供程序根据用户设置角色。

<强> CustomeAuthenticationProvider

{{1}}

我使用了自定义身份验证。当我玩Spring安全时,我没有进行任何数据库配置。您可以按自己的方式实现它。以上验证了身份验证凭据并设置了角色(权限)。由于管理员也能够查看用户模块(大多数情况下,至少是我的构想),我已经附加了权限用户和&amp;管理员登录时的管理员。简单来说, 1.当用户登录时,他将能够访问每个/ **,但不能访问/ admin / ** 2.当管理员登录时,他将能够访问每个/ **和/ admin / **

我已经测试了这些方案,以及您可以在此处查看的整个代码 - https://github.com/satya-j/rab