- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
服务在受信任空间中的网关之后工作(gateWay 验证 OAuth token 并仅向服务提供唯一的用户 ID,否则它会重定向以验证服务)。
我想在服务中使用 spring security 来验证 userId 的权限。
所以我添加了CustomUserDetailsService
@Service("userDetailsService")public class CustomUserDetailsService implements UserDetailsService { @Autowired(required = false) private ContextSsoActiveProfileIdProvider contextSsoActiveProfileIdProvider; @Autowired private GrantedAuthorityService grantedAuthorityService; @Override public User loadUserByUsername(final String username) throws UsernameNotFoundException { // verify it with authentication service, but there is not token, userId only, so trust to gateway service. return new User( String.valueOf(contextSsoActiveProfileIdProvider.getSsoActiveProfileId()), "authenticatedWithGateWay", grantedAuthorityService.getGrantedAuthoritiesForCurrentUser() ); }}
其中 contextSsoActiveProfileIdProvider.getSsoActiveProfileId() 返回 uniqueUserId,grantedAuthorityService.getGrantedAuthoritiesForCurrentUser() 返回权限。
该服务在受信任的区域中启动,因此我以下一种方式配置了安全性:
@EnableWebSecurity@Configurationpublic class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Autowired private UserDetailsService userDetailsService; @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/**").permitAll(); } @Override protected UserDetailsService userDetailsService() { return userDetailsService; }}
我需要为所有 URI (http.authorizeRequests().antMatchers("/**").permitAll();
) 的所有用户提供免费访问权限(不触发登录优惠),但它似乎抑制了下一个注释的触发处理程序 @PreAuthorize
、@PreFilter
、@PostAuthorize
和 @PostFilter
。
我想我在这里错用了 http.authorizeRequests().antMatchers("/**").permitAll();
或其他配置部分。
更多问题症状:
CustomUserDetailsService.loadUserByUsername(..)
从未被调用;@AuthenticationPrincipal User activeUser
为 nullPrincipal principal
也为 null最佳答案
可信空间问题与匿名用户身份识别有类似的解决方案(我在做这件事的时候就得出了这个结论。)
可信空间不需要授权,但不会调用 UserDetailsService,因为默认只使用 AnonymousAuthenticationProvider
和 AnonymousAuthenticationFilter
。实现基于 AnonymousAuthenticationFilter
覆盖 createAuthentication
并将默认值 (AnonymousAuthenticationFilter
) 替换为自定义过滤器 (CustomAnonymousAuthenticationFilter
) 就足够了>):
@Configuration public static class NoAuthConfigurationAdapter extends WebSecurityConfigurerAdapter { @Autowired private UserDetailsService userDetailsService; @Autowired private IdentifiableAnonymousAuthenticationFilter identifiableAnonymousAuthenticationFilter; @Override protected void configure(HttpSecurity http) throws Exception { http.anonymous().authenticationFilter(identifiableAnonymousAuthenticationFilter); http.antMatcher("/**").authorizeRequests() .anyRequest().permitAll(); } }
I found out that CustomUserDetailsService will never be called if user is not authorized. Continuing research pay attention on the AnonymousAuthenticationFilter which is responsible for creating anonymous user info. So in the very and purpose is to replace the AnonymousAuthenticationFilter with my IdentifiableAnonymousAuthenticationFilter where some methods should be overridden:
@Componentpublic class IdentifiableAnonymousAuthenticationFilter extends AnonymousAuthenticationFilter { public static final String KEY_IDENTIFIABLE_ANONYMOUS_AUTHENTICATION_FILTER = "Key.IdentifiableAnonymousAuthenticationFilter"; @Autowired private CustomUserDetailsService userDetailsService; @Autowired private GrantedAuthorityService grantedAuthorityService; private AuthenticationDetailsSource authenticationDetailsSource = new WebAuthenticationDetailsSource(); public IdentifiableAnonymousAuthenticationFilter() { this(KEY_IDENTIFIABLE_ANONYMOUS_AUTHENTICATION_FILTER); } public IdentifiableAnonymousAuthenticationFilter(String key) { super(key); } @Override protected Authentication createAuthentication(HttpServletRequest request) { AnonymousAuthenticationToken auth = new AnonymousAuthenticationToken( KEY_IDENTIFIABLE_ANONYMOUS_AUTHENTICATION_FILTER, userDetailsService.loadCurrentUser(request), grantedAuthorityService.getGrantedAuthoritiesForCurrentUser()); auth.setDetails(authenticationDetailsSource.buildDetails(request)); return auth; }}
to inject it into configuration
@Configuration
public class IdentifyAnonymousConfigurationAdapter extends WebSecurityConfigurerAdapter {
@Autowired
private IdentifiableAnonymousAuthenticationFilter identifiableAnonymousAuthenticationFilter;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.anonymous().authenticationFilter(identifiableAnonymousAuthenticationFilter);
// ... some other configurations
}
}
现在看起来好多了,因为 identifiableAnonymousAuthenticationFilter 被注入(inject)到 AnonymousConfigurer 中。请注意基于 WebSecurityConfigurerAdapter
的配置。如果你有几个并且其中一个不会设置 customAnonymousAuthenticationFilter 但配置早于 custom.. 你将获得 AnonymousAuthenticationFilter 的默认实例(默认配置在 WebSecurityConfigurerAdapter
中:
protected final HttpSecurity getHttp() throws Exception { //... http .csrf().and() .addFilter(new WebAsyncManagerIntegrationFilter()) .exceptionHandling().and() .headers().and() .sessionManagement().and() .securityContext().and() .requestCache().and() .anonymous().and() // ...
I would not care about it if application fixed, but AnonymousAuthenticationFilter called earlier than IdentifiableAnonymousAuthenticationFilter. And doFilter puts into SecurityContextHolder incorrect
Authentication.
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
if(SecurityContextHolder.getContext().getAuthentication() == null) {
SecurityContextHolder.getContext().setAuthentication(this.createAuthentication((HttpServletRequest)req));
if(this.logger.isDebugEnabled()) {
this.logger.debug("Populated SecurityContextHolder with anonymous token: '" + SecurityContextHolder.getContext().getAuthentication() + "'");
}
} else if(this.logger.isDebugEnabled()) {
this.logger.debug("SecurityContextHolder not populated with anonymous token, as it already contained: '" + SecurityContextHolder.getContext().getAuthentication() + "'");
}
chain.doFilter(req, res);
}
因此,当下次为 IdentifiableAnonymousAuthenticationFilter 调用 doFilter 时,由于条件 if(SecurityContextHolder.getContext ().getAuthentication() == null)
(见之前的方法)
因此,提供配置会非常好,其中使用魔术注释 @Order 来修复 WebSecurityConfigurerAdapter
配置以管理配置加载顺序。
或者有人会想 - 在 IdentifiableAnonymousAuthenticationFilter 中无条件地添加 doFilter
覆盖(这是 hack):
@Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { SecurityContextHolder.getContext().setAuthentication(createAuthentication((HttpServletRequest) req)); if (logger.isDebugEnabled()) { logger.debug("Populated SecurityContextHolder with anonymous token: '" + SecurityContextHolder.getContext().getAuthentication() + "'"); } chain.doFilter(req, res); }
如果您需要 spring security 处理授权/认证用户,这是 Not Acceptable ,但在某些情况下就足够了。
解决方案的某些部分可以改进,但我希望总体上思路清晰。
关于java - 为可信空间定制 Spring Security,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48173057/
请帮助我的建议。 我需要通过 xml 文件中的某个变量在我的应用程序上禁用/启用 spring 安全性。 我的 spring-security.xml 文件
我做了很多研究,对我来说一切看起来都是正确的......但我无法让它发挥作用!有人有什么想法吗? 无论我做什么,相关映射仍然对任何人公开(匿名或登录,无论他们具有什么角色)。 理想情况下,我希望所有请
我们正在考虑为我们网站的一部分启用 SSL,但某些页面包含来自第三方供应商(如 Google AdSense)的广告。 我认为这会给我们的用户带来一个恼人的问题,因为他们在查看带有广告的页面时会看到类
我正在开发一个休息服务,它将通过浏览器提供 浏览器单页应用程序和移动应用程序。目前我的服务正在运行 根本没有 Spring 。 oauth2 客户端是在过滤器内部实现的,所以可以说是“手动”。 我正在
我正在为我公司的网站添加 Content-Security-Policy-Report-Only 标题。在我研究它时,我发现一些页面已经设置了 Content-Security-Policy head
在 XML 配置中,我可以使用 security 命名空间来启用对安全性的支持,例如: 我尝试使用没有 XML 的 Spring,只有 @Configuration 类。与上述 XM
我正在使用 Spring Security 3.0.2,但找不到从数据库加载匿名用户角色的方法(我有动态角色,可以将角色分配给每个人)。 我尝试使用自定义的anonymousAuthenticatio
我有那个代码。但是当我在浏览器中进入 app_dev.php/login浏览器说:该页面进行了太多重定向 安全.yml安全: 编码器: Symfony\Component\Security\Core\
我正在使用SSH Secure Shell客户端,这是一个连接服务器的好工具。 但是,我想知道是否可以记录通过SSH Secure Shell客户端运行的程序中所有即将出现的消息。例如:./ test
我有那个代码。但是当我在浏览器中进入 app_dev.php/login浏览器说:该页面进行了太多重定向 安全.yml安全: 编码器: Symfony\Component\Security\Core\
如何为表单例份验证提供程序设置 success_handler(和 failure_handler)? Silex 使用此配置忽略我: register(new Silex\Provider\Secu
新手问题...我已成功实现自定义处理程序和服务(自定义用户详细信息服务、身份验证成功、身份验证失败)并且一切正常。我现在还实现了如果 3 次并发身份验证失败将锁定帐户(一定时间)的功能。 我现在继续处
我正在使用 Spring security java 配置,我想知道一种实现多个 url 注销的方法。即 logout().logoutRequestMatcher(new AntPathReques
我正在为我的 SP 使用 Spring Security SAML 扩展。用户通过 IDP 身份验证后,SP 使用某种方法允许后续调用不必通过 IDP 重新进行身份验证。这是如何在 Spring Se
spring security 有没有办法防止下面的最后一点?我正在使用 3.0.5 - 用户登录我的网站 - 用户转到网站中的任何页面并单击注销 -注销链接使用户 session 无效并将它们发送到
要么我迟到了,要么我做错了什么。我正在使用 Visual Studio 2013,但是我试图使用 Membership 类,using System.Web.Security;我的程序集中不存在命名空
我有一个具有依赖性的oauth2客户端spring-boot应用程序: - Spring 靴1.2.0.RC1 -spring-security-oauth2 2.0.4.RELEASE - Spri
我想在控制台应用程序中生成 HashPasswordForStoringInConfigFile。 它是在 Web 应用程序中使用以下类完成的 System.Web.Security.FormsAut
我需要有多个 PRE_AUTH Spring 安全过滤器。特别是我需要使用 PRE_AUTH除了配置为 PRE_AUTH 的两个过滤器之外的过滤器在 Spring Security 3.0 的 SAM
我猜这里没有答案,但我想知道是否有办法创建这样的自定义注释: @Documented @Inherited @Retention(RetentionPolicy.RUNTIME) @Target({E
我是一名优秀的程序员,十分优秀!