gpt4 book ai didi

spring - 使用 Spring Security 进行身份验证后如何基于角色进行重定向

转载 作者:行者123 更新时间:2023-12-01 16:28:07 25 4
gpt4 key购买 nike

我使用 spring security、spring、hibernate 和 jsf身份验证工作正常,但它总是将我重定向到页面 home.jsf

我想在身份验证后管理用户的访问

我想在身份验证后管理用户的访问

如果权限 = ROLE_ADMIN 则重定向 ves homeadmin.jsf

如果权限 = ROLE_RH 重定向 ves homerh.jsf

如果权限 = ROLE_EXCUTIVE 则重定向 ves homeex.jsf

如果权限 = ROLE_MANAGER 则重定向 ves homem.jsf

如果权限 = ROLE_GP 重定向 ves homegp.jsf

Collaborateur 表中的权限字段

合作者类别是

private Integer idColaborateur;
private Rolecol rolecol;
private String matriculeColaborateur;
private String nomColaborateur;
private String prenomColaborateur;
private String mailColaborateur;
private String pwdColaboratuer;
private String loginColaborateur;

private String adresseColaborateur;
private Boolean flgSuspendu;
private Set<HistoriqueNoteObjctif> historiqueNoteObjctifs = new HashSet<HistoriqueNoteObjctif>(
0);
private Set<Note> notes = new HashSet<Note>(0);
private Set<NoteObjectifs> noteObjectifses = new HashSet<NoteObjectifs>(0);
private Set<CompagneDevaluation> compagneDevaluations = new HashSet<CompagneDevaluation>(
0);
private Set<ColaborateurHierarchique> colaborateurHierarchiques = new HashSet<ColaborateurHierarchique>(
0);
private String authority;
//getter and seter

数据源配置位于文件applicationContext.xml中

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="root" />
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/modulevsql" />
<property name="password" value="root" />
<property name="maxStatementsPerConnection" value="0" />
<property name="maxAdministrativeTaskTime" value="0" />
<property name="maxConnectionAge" value="0" />
<property name="maxIdleTime" value="0" />
<property name="maxIdleTimeExcessConnections" value="0" />
<property name="maxPoolSize" value="0" />
<property name="maxStatements" value="0" />
</bean>

用户类别是

public class User implements UserDetails {


private static final long serialVersionUID = 1L;
private String name;
private String password;
private Colaborateur user;

public void setUser(Colaborateur user) {
this.user = user;
}

public User(String name) {
FacesContext fc=FacesContext.getCurrentInstance();
UserBean userBean=(UserBean) fc.getApplication().createValueBinding("#{UserBean}").getValue(fc);

userBean.chargerUtilisateur(name);
user = userBean.getUtilisateur();


System.err.println("USERS >>> "+user);


PasswordSupport pswdSupport = new PasswordSupport();

if (user!=null){

System.out.println("User.getLogin() :"+user.getLoginColaborateur());
System.out.println("user.getPwd() :"+user.getPwdColaboratuer());
this.name=user.getMatriculeColaborateur();
this.password=user.getPwdColaboratuer();
System.err.println(pswdSupport.getMD5Hash("1"));
}
}


public Collection<GrantedAuthority> getAuthorities() {

List<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>();



System.out.println("GrantedAuthorityImpl 1");
System.out.println("GrantedAuthorityImpl 2");
System.out.println("GrantedAuthorityImpl 3");
System.out.println("GrantedAuthorityImpl 4");

grantedAuthorities.add(new GrantedAuthorityImpl("ROLE_VISITEUR"));


return grantedAuthorities;
}
//getter and setter

这是 applicationContext-security.xml 文件

<?xml version="1.0" encoding="UTF-8"?>

<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd">

<global-method-security secured-annotations="enabled">
</global-method-security>


<http pattern="/modules/members/**" access-denied-page="/modules/members/accessDenied.jsf" authentication-manager-ref="MembersAuthenticationManager">

<intercept-url pattern="/modules/members/secure/**" access="ROLE_VISITEUR" />
<intercept-url pattern="/modules/members/secure/homeadmin.jsf" access="ROLE_ADMIN" />

<intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />

<form-login login-page="/modules/members/login.jsf"
default-target-url="/modules/members/secure/home.jsf"
login-processing-url="/modules/members/j_spring_security_check"
authentication-failure-url="/modules/members/login.jsf" />
<logout logout-url="/modules/members/secure/logout"
logout-success-url="/modules/members/login.jsf" delete-cookies="true" />

</http>


<authentication-manager alias="MembersAuthenticationManager">
<authentication-provider user-service-ref="securityManager">
<password-encoder hash="md5" />
</authentication-provider>
</authentication-manager>
<beans:bean id="securityManager" class="tn.com.security.SecurityManager" />

</beans:beans>

最佳答案

实现 AuthenticationSuccessHandler 并根据您传入的 Authentication 中包含的 GrantedAuthority 对象集合进行重定向。

public class CustomAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authResult) throws IOException, ServletException {
/* Redirect on the successful authentication of the user */
logger.info("Hit the AuthSuccessHandler");
String redirectAddress = null;
Collection<? extends GrantedAuthority> auths = authResult.getAuthorities();
if(auths.contains("ROLE_ADMIN"){
response.sendRedirect(response.encodeURL("homeadmin.jsf");
}

等等等等

您甚至可以将您的角色添加到枚举中并编写 switch 语句来确定重定向位置。

确保在安全配置中声明您的AuthenticationSuccessHandler

<beans:bean id="customAuthenticationSuccessHandler" class="foo.bar.CustomAuthenticationSuccessHandler" /> 

<form-login login-page="/LoginView"
authentication-success-handler-ref="customAuthenticationSuccessHandler"
authentication-failure-url="/FailedLogin" />

关于spring - 使用 Spring Security 进行身份验证后如何基于角色进行重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23642325/

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