我正在做一个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
。
答案 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.
}
}
答案 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