gpt4 book ai didi

java - SpringSecurity - 自定义自动认证

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:26:58 24 4
gpt4 key购买 nike

这是我的场景:

  • 网络应用程序为许多应用程序执行某种 SSO
  • 登录用户点击链接后,应用程序会向正确的应用程序发送包含用户信息(姓名、密码 [无用]、角色)的帖子
  • 我正在其中一个应用程序上实现 SpringSecurity,以从它的强大功能中获益( session 中的权限、类提供的方法等)

所以,我需要开发一个自定义过滤器 - 我猜 - 它能够通过自定义 DetailsUserService 从请求中检索用户信息,从数据库中检索,进一步有关用户的信息(电子邮件等),然后根据从请求中检索到的角色对该用户进行身份验证。

我在看 Pre-Authentication过滤器,但我不确定这是正确的选择。看起来那些对象应该在委托(delegate)人已经在 session 中时使用,由一些以前的身份验证机制放置(是吗?)。

我认为,一旦确定了正确的过滤器,我应该需要执行以下操作:

GrantedAuthority[] ga= new GrantedAuthority[1];
ga[0] = new GrantedAuthorityImpl(myUser.getRole());

SecurityContext sc = SecurityContextHolder.getContext();
Authentication a = new UsernamePasswordAuthenticationToken(userName, userPwd, ga);
a = authenticationManager.authenticate(a);
sc.setAuthentication(a);

这是解决我的问题的正确方向吗?你有什么建议可以帮助我找到丢失的东西吗?

谢谢大家

卢卡

添加:

嗨,Xearxess!很抱歉再次打扰你,但根据 SpringSecurity 2.0.4 翻译你的代码似乎比我想象的更难:S 问题是 XML ......我尝试了不同的配置但我总是遇到 namespace 问题,缺少属性等等……

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:security="http://www.springframework.org/schema/security"
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-2.0.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.4.xsd">

<security:http>
<security:intercept-url pattern="/**" access="isAuthenticated()" />
<security:logout logout-url="/logout" logout-success-url="http://milan-ias-vs.usersad.everis.int/DMTest/" invalidate-session="true" />
<security:custom-filter position="PRE_AUTH_FILTER" ref="preAuthenticatedProcessingFilter" />
</security:http>

<bean id="preAuthenticatedProcessingFilter" class="it.novartis.ram.authentication.PreAuthenticatedProcessingFilter">
<custom-filter position="PRE_AUTH_FILTER"/>
<property name="authenticationManager" ref="authenticationManager" />
</bean>

<bean id="preauthAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
<property name="preAuthenticatedUserDetailsService">
<bean class="it.novartis.ram.authentication.PreAuthenticatedUserDetailsService" />
</property>
</bean>

<security:authentication-manager alias="authenticationManager">
<security:authentication-provider ref="preauthAuthProvider" />
</security:authentication-manager>

</beans>

引用 CUSTOM-FILTER 元素的 2 行是两次不同的尝试,它们都被标记为错误。如何将过滤器的位置指定为属性?

此外,身份验证管理器定义中的身份验证提供程序引用也被标记为错误。我想我也需要像属性一样指定它,对吗?

希望你能给我最后一击;)再次感谢您,

卢卡

最佳答案

为了完整起见,Spring Security 4 中的内容略有变化。例如,强烈推荐 Java 配置。这样更容易与Spring Boot集成。

它遵循等同于上述答案中给出的 XML 配置的 Java 配置。

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {
http.addFilterBefore(customAuthFilter(), AbstractPreAuthenticatedProcessingFilter.class)
.authenticationProvider(preauthAuthProvider())
.authorizeRequests()
.anyRequest().authenticated();
}

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(preauthAuthProvider());
}

@Bean
public PreAuthenticatedAuthenticationProvider preauthAuthProvider() {
PreAuthenticatedAuthenticationProvider preauthAuthProvider =
new PreAuthenticatedAuthenticationProvider();
preauthAuthProvider.setPreAuthenticatedUserDetailsService(
userDetailsServiceWrapper());
return preauthAuthProvider;
}

@Bean
public OnlyRolesPreAuthenticatedUserDetailsService userDetailsServiceWrapper() {
OnlyRolesPreAuthenticatedUserDetailsService service =
new MyPreAuthenticatedUserDetailsService();
return service;
}

@Bean
public MyPreAuthenticatedProcessingFilter customAuthFilter() throws Exception {
MyPreAuthenticatedProcessingFilter filter = new MyPreAuthenticatedProcessingFilter();
filter.setAuthenticationManager(authenticationManager());
return filter;
}
}

我认为上面的代码是值得的,因为互联网上的示例非常基础,而 Spring 文档缺乏这些细节。

关于java - SpringSecurity - 自定义自动认证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12478589/

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