gpt4 book ai didi

java - Spring 安全 - @PreAuthorize 不工作

转载 作者:搜寻专家 更新时间:2023-11-01 01:33:31 25 4
gpt4 key购买 nike

我在使用 @PreAuthorize 注释时遇到问题。即使我的用户不拥有请求的角色,我的安全方法也会被执行。

我的 Controller :

@Controller
@RequestMapping("/stats/distributions")
public class DistributionStatsController {

@PreAuthorize("hasAnyAuthority('AK_LOCAL_DIST_INT', 'AK_ADMIN')")
@RequestMapping(method = RequestMethod.POST, consumes = "application/json; charset=utf-8",
produces = "application/json; charset=utf-8")
public @ResponseBody List<DistributionStatsResource> filter(@RequestBody DistributionStatsResource resource,
@RequestParam(required = false, value = "documentId") Long documentId,
@RequestParam(required = false, value = "distStatus") EnumDistributionStatus distributionStatus,
Pageable pageable, HttpServletRequest request) {
}
}

这是我的 spring 安全配置:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

/** Defines the AuthenticationManager/providers. */
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(preAuthenticatedAuthenticationProvider());
}

@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/css/**", "/font/**", "/icones/**", "/img/**");
}

@Override
protected void configure(HttpSecurity http) throws Exception {
// TODO Configure HTTP URLs and filters.
http.authorizeRequests().antMatchers("/views/access401.html").permitAll().antMatchers("/views/admin/agent.html").hasAuthority("AK_ADMIN")
.antMatchers("/views/admin/agentDetail.html").hasAuthority("AK_ADMIN").antMatchers("/views/admin/businesses.html")
.hasAuthority("AK_ADMIN").antMatchers("/views/admin/distributors.html").hasAuthority("AK_ADMIN")
.antMatchers("/views/admin/distributionReportList.html").hasAuthority("AK_ADMIN")
.antMatchers("/views/documentEdition/documentDetail.html").hasAnyAuthority("AK_CENTRAL_DIST", "AK_LOCAL_DIST_INT", "AK_ADMIN")

.antMatchers("/views/home/home.html").fullyAuthenticated().antMatchers("/views/distribution/distribution.html")
.hasAnyAuthority("AK_LOCAL_DIST_INT", "AK_ADMIN").antMatchers("/views/distribution/distributionEdit.html")
.hasAnyAuthority("AK_LOCAL_DIST_INT", "AK_ADMIN").antMatchers("/views/admin/types.html").hasAuthority("AK_ADMIN").and()
.exceptionHandling().authenticationEntryPoint(unauthorizedEntryPoint()).and().addFilter(habileFilter()).csrf().disable(); // Disable CSRF
// protection.
}

/** Gives an alias to the authenticationManager. */
@Override
@Bean(name = "authenticationManager")
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}

/** A unauthorized entry point. */
@Bean
public AuthenticationEntryPoint unauthorizedEntryPoint() {
return new ForbiddenEntryPoint();
}

/** The user details service used by the PreAuthenticatedAuthenticationProvider. */
@Bean
public AuthenticationUserDetailsService<PreAuthenticatedAuthenticationToken> myAuthenticationUserDetailsService() {
return new NgwisAuthenticationUserDetailsService();
}

/** The PreAuthenticatedAuthenticationProvider. */
@Bean
public PreAuthenticatedAuthenticationProvider preAuthenticatedAuthenticationProvider() {
PreAuthenticatedAuthenticationProvider pro = new PreAuthenticatedAuthenticationProvider();
pro.setPreAuthenticatedUserDetailsService(myAuthenticationUserDetailsService());
return pro;
}

// ---- Filters.

/** Builds an Habile filter.
*
* @return the habile filter. */
@Bean
public RequestHeaderAuthenticationFilter habileFilter() throws Exception {
NgwisRequestHeaderAuthenticationFilter filter = new NgwisRequestHeaderAuthenticationFilter();
filter.setPrincipalRequestHeader("SM_USER");
filter.setCredentialsRequestHeader(NgwisRequestHeaderAuthenticationFilter.HABILE_FILTER_NAME);
filter.setAuthenticationManager(authenticationManager());
return filter;
}
}

(我的基础配置类中引用了这个类)

我的 RequestHeaderAuthenticationFilter 类:

public class NgwisRequestHeaderAuthenticationFilter extends RequestHeaderAuthenticationFilter {

public static final String HABILE_FILTER_NAME = "HABILE";

/** Pour mise à disposition des informations de sécurité */
public static final String BEAN_SECURITIES = "com.airfrance.springsecurity.securities";

private static final org.slf4j.Logger logger = LoggerFactory.getLogger(NgwisRequestHeaderAuthenticationFilter.class);

// AK de l'utilisateur en fonction de ses profils
private UserAccessKeys userAccessKeys = null;

// Pour passer l'info au niveau de la config de spring security
private String credentialsRequestHeader;

@Inject
private IAgentService agentService;

@Inject
private DozerBeanMapper mapper;

/** Credentials aren't usually applicable, but if a {@code credentialsRequestHeader} is set, this will be read and used as
* the credentials value. Otherwise a dummy value will be used. */
@Override
protected Object getPreAuthenticatedCredentials(HttpServletRequest request) {
Collection<GrantedAuthority> tmp = new ArrayList<GrantedAuthority>();
User user = new User(request.getRemoteUser().toUpperCase(), "none", false, false, false, false, tmp);
if (credentialsRequestHeader != null) {
if (credentialsRequestHeader.equalsIgnoreCase("HABILE")) {
try {
LdapBean ldBean = LdapBeanAccessor.getLdapBean(request);
if (ldBean != null) {
userAccessKeys = new UserAccessKeys(request, ldBean, agentService, mapper);
request.getSession().setAttribute(BEAN_SECURITIES, userAccessKeys);
List<String> auths = new ArrayList<String>();
for (GrantedAuthority auth : userAccessKeys.getAuthorities()) {
auths.add(auth.getAuthority());
}
logger.debug("User {} connected with authorities {}", userAccessKeys.getLogin(), StringUtils.join(auths, ", "));
user = new User(request.getRemoteUser().toUpperCase(), "none", true, true, true, true, userAccessKeys.getAuthorities());
}
} catch (NoLdapBeanInSessionException e) {
logger.error("Erreur lors de la connexion de {}", request.getRemoteUser().toUpperCase(), e);
} catch (NotProtectedGetLdapException e) {
logger.error("Erreur technique ", e);
}
if (userAccessKeys.getAgent() != null) {
return user;
} else {
return null;
}
} else {
return request.getHeader(credentialsRequestHeader);
}
}

return "N/A";
}

@Override
public void setCredentialsRequestHeader(String credentialsRequestHeader) {
Assert.hasText(credentialsRequestHeader, "credentialsRequestHeader must not be empty or null");
this.credentialsRequestHeader = credentialsRequestHeader;
}
}

我检查了这个类,我们获得了登录用户的权限。一切似乎都很好。

当我用一个只有 AK_CONSULT 角色的用户运行这段代码时,该方法被执行并且没有触发 503 ERROR

感谢您的帮助。

最佳答案

我的同事发现了诀窍。@EnableGlobalMethodSecurity(prePostEnabled = true) 注解必须spring-security 配置类中,但在 Servlet 配置类中。

@Configuration
@EnableWebMvc
@EnableSpringDataWebSupport
@EnableJpaRepositories
@EnableGlobalMethodSecurity(prePostEnabled = true)
@ComponentScan(basePackages = { "mypackage.spring.rest" }, excludeFilters = @Filter(type = FilterType.ANNOTATION, value = Configuration.class))
public class SpringRestConfiguration {

}

而且有效!

关于java - Spring 安全 - @PreAuthorize 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29643183/

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