gpt4 book ai didi

spring - 使用 Spring security 和 Thymeleaf - Spring 根据角色重定向页面

转载 作者:行者123 更新时间:2023-12-05 08:55:29 42 4
gpt4 key购买 nike

我正在使用 Spring security 和 Thymeleaf 开发我的项目。我有基本的 Spring Security 集成。

SecurityConfig.java

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{

@Autowired
private DataSource dataSource;

@Autowired
public void configureGlobal (AuthenticationManagerBuilder auth) throws Exception
{
auth
.jdbcAuthentication()
.dataSource(dataSource);
}

protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/login").permitAll()
.antMatchers("/classesTable").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")

.and()
.httpBasic();
}
}

SecurityWebApplicationInitializer.java

public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer
{
public SecurityWebApplicationInitializer(){
super(SecurityConfig.class);
}

}

在我的项目中,我有三个角色:学生、教授和管理员。我想要实现的是当我的学生登录时他被重定向到页面 indexUser.html。当我的教授登录时,他被重定向到 indexProfesor.html,当管理员登录时,他登陆到 indexAdmin.html 页面。

我想到了这样的事情

if(role.contains("ROLE_ADMIN")){
//redirect from here to indexAdmin.html

}else if(role.contains("ROLE_USER")) {
//redirect to indexUser.html
}else
//redirect to indexProfesor.html
}

但我不知道整个 Controller 应该是什么样子。

让我的 homeContorller 看起来像这样:

@Controller
public class HomeController {

@RequestMapping(value = "/login", method = RequestMethod.GET)
public String loginPage(Model model) {
return "login";
}
}

我也将这段代码添加到我的 index.html

<span sec:authorize="isAuthenticated()">
<span sec:authentication="name"></span>
| Roles: <span sec:authentication="principal.authorities"></span> |

所以我很熟悉我登录的用户所拥有的角色。这也是我的 login.html 的代码

<form  th:action="@{/login}" method="post" class="l-form">
<input type="text" name="username"/>
<input type="password" name="password"/>
<input type="hidden" th:name="${_csrf.parameterName}"
th:value="${_csrf.token}" />

<button type="submit" class="btn">Sign in!</button>
</form>

最佳答案

已找到适合我的解决方案。

我将 http.formLogin().defaultSuccessUrl("/success", true) 添加到我的 SpringConfig 文件中。

看起来像这样

protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/login").permitAll()
.antMatchers("/classesTable").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/success", true)
.and()
.httpBasic();
}

然后我在 HomeController 中创建了一个名为 loginPageRedirect 的新方法

@Controller
public class HomeController {

@RequestMapping(value = "/login", method = RequestMethod.GET)
public String loginPage(Model model) {
return "login";
}

@RequestMapping("/success")
public void loginPageRedirect(HttpServletRequest request, HttpServletResponse response, Authentication authResult) throws IOException, ServletException {

String role = authResult.getAuthorities().toString();

if(role.contains("ROLE_ADMIN")){
response.sendRedirect(response.encodeRedirectURL(request.getContextPath() + "/indexAdmin"));
}
else if(role.contains("ROLE_USER")) {
response.sendRedirect(response.encodeRedirectURL(request.getContextPath() + "/indexUser"));
}
}

}

希望对遇到同样问题的人有所帮助。

关于spring - 使用 Spring security 和 Thymeleaf - Spring 根据角色重定向页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45709333/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com