如何使用Spring Security将已登录的用户重定向到其首页,并将未登录的用户重定向到另一页

时间:2019-05-22 10:22:12

标签: spring spring-boot spring-mvc spring-security spring-data-jpa

我正在做一个Spring Web应用程序项目,作为学校的最终项目。我们将SpringBoot与Hibernate和H2数据库一起使用。为了进行身份验证和授权,我们使用Spring Security。我们还将模型View-Controller与存储库,服务和控制器一起使用。 我有一个初始首页(with the URL "/"),当您打开项目时会显示该首页。登录后,您将使用URL(“ / portadaUsuario”)重定向到另一个首页(我来自西班牙,所以西班牙语有很多名称)。但是,如果您在登录后以某种方式最终到达(“ /”)URL,则会显示与未登录用户相同的首页,该首页具有登录和登录选项,显然是错误的。

我知道我可以使用spring安全标签和元素显示不同的HTML元素,但是我已经围绕两个不同的首页构建了我的项目,如果可能的话,我希望保持这种状态。如果无法实现,请告诉我如何继续在同一HTML文件中显示不同的元素。

以下是我的WellcomeController的方法

@Controller
public class PortadaController {

    @GetMapping({"/"})
    public String mostrarPortada() {
        return "portada";
    }

    @GetMapping("/portadaUser")
    public String mostrarPortadaUsuario() {
        return "/usuario/portada";
    }
}

以下是验证用户身份的方法

@Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/css/**","/js/**","/webjars/**", "/h2-console/**", "/", "/newUser/**").permitAll()
                        .antMatchers("/admin/**").hasAnyRole("ADMIN")
                        .anyRequest().authenticated()
                        .and()
                .formLogin()
                        .loginPage("/login")
                        .permitAll()
                        .successHandler(customSuccessHandler)
                        .defaultSuccessUrl("/portadaUser")
                        .and()
                .logout()
                        .logoutUrl("/logout")
                        .permitAll()
                        .logoutSuccessUrl("/")
                        .and()
                .exceptionHandling()
                        .accessDeniedPage("/acceso-denegado");


        http.csrf().disable();
        http.headers().frameOptions().disable();
        }

我想要的是应用程序检测登录用户何时请求“ /” URL,并将其重定向到/portadaUser

2 个答案:

答案 0 :(得分:0)

在jsp + Spring 4.3.13 + Spring Security 4.2.11中进行了测试

1。签入 jsp

“ <%@ taglib prefix =” sec“ uri =” http://www.springframework.org/security/tags“%>”

<script>
    <sec:authorize access="hasRole('ADMIN')">
        location.replace('/yourpage')
    </sec:authorize>
</script>  

2。已在控制器
中签入 SpringSecurityUtil.class

 public class SpringSecurityUtil {

        public static boolean hasRole(String role) {
            Collection<GrantedAuthority> authorities = (Collection<GrantedAuthority>) SecurityContextHolder.getContext().getAuthentication().getAuthorities();
            boolean hasRole = false;
            for (GrantedAuthority authority : authorities) {
                if(authority.getAuthority().equals(role)) {
                    hasRole = true;
                    break;
                }
            }

            return hasRole;
        }

    }

HomeController.class

@Controller
public class HomeController {

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String home(HttpServletResponse resp) {
        if(SpringSecurityUtil.hasRole("ADMIN"))
            //if has role send your page
        else
            //if has not role send your page
    }
}  

3。在您的Spring Security Config类中添加antMatchers。

antMatchers("/").hasAnyRole("ADMIN")

4。使用@PreAuthority

@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled=true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    ...
}

HomeController.class

 @Controller
    public class HomeController {

        @PreAuthorize("hasAuthority('ADMIN')")
        @RequestMapping(value = "/", method = RequestMethod.GET)
        public String home() {
              //If this code starts, you have ADMIN privileges.
        }
    }  

查看更多Spring Security Method Security

答案 1 :(得分:0)

假设您有两个页面,一个页面用于登录(在家登录),另一页面用于未登录(非在家登录),则您需要编写类似以下代码的代码-

@GetMapping("/")
public String index(Principal principal, Model model) {
   return principal != null ? "signed-in-home" : "not-signed-in-home";
}

在此处详细了解本金-https://www.baeldung.com/get-user-in-spring-security