Questions tagged «spring-security»

Spring Security是Spring Framework的应用程序安全解决方案。Spring安全性可用于保护URL和方法调用。它被广泛用于保护独立的Web应用程序,Portlet和越来越多的REST应用程序。

17
使用Spring Security时,在bean中获取当前用户名(即SecurityContext)信息的正确方法是什么?
我有一个使用Spring Security的Spring MVC Web应用程序。我想知道当前登录用户的用户名。我正在使用下面给出的代码片段。这是公认的方式吗? 我不喜欢在此控制器内调用静态方法-这违反了Spring IMHO的全部目的。有没有一种方法可以配置应用程序以注入当前的SecurityContext或当前的Authentication? @RequestMapping(method = RequestMethod.GET) public ModelAndView showResults(final HttpServletRequest request...) { final String currentUser = SecurityContextHolder.getContext().getAuthentication().getName(); ... }

4
通过Spring的RESTful身份验证
问题: 我们有一个基于Spring MVC的RESTful API,其中包含敏感信息。API应该是安全的,但是不希望随每个请求一起发送用户凭证(用户/密码组合)。根据REST准则(和内部业务要求),服务器必须保持无状态。该API将由另一台服务器以mashup方式使用。 要求: 客户端.../authenticate使用凭证向(不受保护的URL)发出请求;服务器返回一个安全令牌,该令牌包含足以使服务器验证未来请求并保持无状态的信息。这可能包含与Spring Security的Remember-Me Token相同的信息。 客户端向各种(受保护的)URL发出后续请求,将先前获得的令牌附加为查询参数(或者,不太希望是HTTP请求标头)。 不能期望客户端存储cookie。 由于我们已经使用过Spring,因此该解决方案应该利用Spring Security。 我们一直在努力地解决这个问题,所以希望外面有人已经解决了这个问题。 在上述情况下,您将如何解决这一特殊需求?

4
Spring Security中角色和GrantedAuthority之间的区别
Spring Security中有一些概念和实现,例如GrantedAuthority用于获得授权来授权/控制访问权限的接口。 我希望对允许的操作(例如createSubUsers或deleteAccounts)进行操作,这些操作将允许管理员(具有role ROLE_ADMIN)使用。 我在网上看到的教程/演示让我感到困惑。我尝试将我阅读的内容联系起来,但我认为我们可以将两者互换。 我看到正在hasRole消耗GrantedAuthority字符串吗?我肯定在理解上做错了。Spring Security中的这些概念是什么? 如何将用户的角色与角色的权限分开存储? 我还查看org.springframework.security.core.userdetails.UserDetails了身份验证提供程序引用的DAO中使用的接口,该接口消耗了User(请注意最后的GrantedAuthority): public User(String username, String password, boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked, Collection<? extends GrantedAuthority> authorities) 还是有其他方法可以区分其他两个?还是不受支持,我们必须自己做?

1
Wildfly上的Spring Security:执行过滤器链时出错
我正在尝试将Spring Security SAML Extension与Spring Boot集成在一起。 关于此事,我确实开发了完整的示例应用程序。其源代码可在GitHub上找到: GitHub上的spring-boot-saml-integration 通过将其作为Spring Boot应用程序运行(针对SDK内置的Application Server运行),WebApp可以正常工作。 不幸的是,相同的AuthN进程在Undertow / WildFly上根本不起作用。 根据日志,IdP实际上执行AuthN过程:我的自定义UserDetails实现的指令已正确执行。尽管有执行流程,Spring仍未设置并保留当前用户的特权。 @Component public class SAMLUserDetailsServiceImpl implements SAMLUserDetailsService { // Logger private static final Logger LOG = LoggerFactory.getLogger(SAMLUserDetailsServiceImpl.class); @Override public Object loadUserBySAML(SAMLCredential credential) throws UsernameNotFoundException, SSOUserAccountNotExistsException { String userID = credential.getNameID().getValue(); if (userID.compareTo("jdoe@samplemail.com") != 0) { // We're …

15
Spring 3.0-无法找到XML模式命名空间的Spring NamespaceHandler [http://www.springframework.org/schema/security]
任何想法可能是什么原因? 无法找到用于XML模式名称空间的Spring NamespaceHandler [ http://www.springframework.org/schema/security] org.springframework.web.context.ContextLoader initWebApplicationContext: Context initialization failed org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/security] Offending resource: ServletContext resource [/WEB-INF/applicationContext.xml] 这是我的applicationContext.xml: <?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd"> ... </beans:beans> 在我的pom.xml中,我有: <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-core</artifactId> <version>3.0.1.RELEASE</version> …


8
如何获取活动用户的UserDetails
在我的控制器中,当我需要活动(登录)用户时,我正在执行以下操作以获取UserDetails实现: User activeUser = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal(); log.debug(activeUser.getSomeCustomField()); 它工作正常,但我认为Spring在这种情况下可以使生活更轻松。有没有办法将UserDetails自动接线连接到控制器或方法中? 例如,类似: public ModelAndView someRequestHandler(Principal principal) { ... } 但是UsernamePasswordAuthenticationToken我得到了,UserDetails而不是得到了? 我正在寻找一个优雅的解决方案。有任何想法吗?


11
使用Spring Security进行单元测试
我公司一直在评估Spring MVC,以确定我们是否应该在我们的下一个项目中使用它。到目前为止,我喜欢我所看到的内容,现在,我正在研究Spring Security模块,以确定是否可以/应该使用它。 我们的安全要求非常基本。用户只需要能够提供用户名和密码即可访问网站的某些部分(例如获取有关其帐户的信息);并且网站上的页面很少(常见问题解答,支持等),应该为匿名用户提供访问权限。 在我创建的原型中,我已经在Session中为经过身份验证的用户存储了一个“ LoginCredentials”对象(其中仅包含用户名和密码)。例如,某些控制器检查此对象是否在会话中,以获取对登录用户名的引用。我正在寻找用Spring Security替换这种自生的逻辑,这将具有消除“我们如何跟踪已登录用户的方式”的好处。和“我们如何验证用户身份?” 从我的控制器/业务代码。 看来Spring Security提供了(每个线程)“上下文”对象,以便能够从您应用程序中的任何位置访问用户名/主要信息... Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); ...在某种程度上似乎很不像Spring,因为该对象是一个(全局)单例。 我的问题是这样的:如果这是在Spring Security中访问有关已认证用户的信息的标准方法,那么将Authentication对象注入SecurityContext的可接受的方法是什么,以便当单元测试需要一个认证用户? 我是否需要在每个测试用例的初始化方法中进行连接? protected void setUp() throws Exception { ... SecurityContextHolder.getContext().setAuthentication( new UsernamePasswordAuthenticationToken(testUser.getLogin(), testUser.getPassword())); ... } 这似乎太冗长了。有更容易的方法吗? 该SecurityContextHolder对象本身看起来非常不像Spring ...

3
Spring Security筛选器链如何工作
我意识到Spring安全性是建立在过滤器链上的,该过滤器将拦截请求,检测(不存在)身份验证,重定向到身份验证入口点或将请求传递给授权服务,并最终让请求到达servlet或引发安全异常(未经身份验证或未经授权)。DelegatingFitlerProxy将这些过滤器粘合在一起。为了执行任务,这些筛选器访问服务,例如UserDetailsS​​ervice和AuthenticationManager。 链中的关键过滤器为(按顺序) SecurityContextPersistenceFilter(从JSESSIONID恢复身份验证) UsernamePasswordAuthenticationFilter(执行身份验证) ExceptionTranslationFilter(从FilterSecurityInterceptor捕获安全异常) FilterSecurityInterceptor(可能会抛出身份验证和授权异常) 我对如何使用这些过滤器感到困惑。是否是在春季提供的表单登录中,UsernamePasswordAuthenticationFilter仅用于/ login,而后面的过滤器未使用?表单登录名称空间元素是否自动配置这些过滤器?是否每个请求(无论是否经过身份验证)都到达非登录URL的FilterSecurityInterceptor? 如果我想使用从登录名检索到的JWT-token保护我的REST API ,该怎么办?我必须配置两个名称空间配置http标签,对吗?一个用于/ login,使用UsernamePasswordAuthenticationFilter,另一个用于REST URL,带有自定义JwtAuthenticationFilter。 配置两个http元素会创建两个元素springSecurityFitlerChains吗?是UsernamePasswordAuthenticationFilter默认是关闭的,直到我宣布form-login?如何SecurityContextPersistenceFilter用Authentication将从现有JWT-token而不是从中获取的过滤器替换JSESSIONID?

3
Shiro与SpringSecurity的比较
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 改善这个问题 我目前正在评估基于Java的安全框架,我是Spring 3.0用户,因此看来SpringSecurity将是正确的选择,但是Spring安全性似乎遭受了过多的复杂性困扰,当然似乎并没有使安全性易于实现, Shiro似乎更加连贯,更容易理解。我正在寻找这两个框架之间的利弊清单。

7
Spring MVC的DelegatingFilterProxy有什么意义?
我在Spring MVC应用程序的中看到了这一点web.xml: <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> 我试图弄清楚为什么它存在以及是否真正需要它。 我在Spring文档中找到了这种解释,但并不能帮助我理解它: 似乎表明该组件是web.xmlSpring中定义的servlet 和Spring中定义的组件之间的“胶水” applicationContext.xml。 7.1 DelegatingFilterProxy 使用servlet过滤器时,显然需要在中声明它们web.xml,否则servlet容器将忽略它们。在Spring Security中,过滤器类也是在应用程序上下文中定义的Spring Bean,因此能够利用Spring丰富的依赖项注入工具和生命周期接口。Spring DelegatingFilterProxy提供了web.xml与应用程序上下文之间的链接。 使用DelegatingFilterProxy时,您将在web.xml文件中看到以下内容: <filter> <filter-name>myFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>myFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 请注意,过滤器实际上是一个DelegatingFilterProxy,而不是将实际实现过滤器逻辑的类。什么DelegatingFilterProxy确实是通过向其从Spring应用程序上下文中的bean代理Filter的方法。这使bean可以从Spring Web应用程序上下文生命周期支持和配置灵活性中受益。Bean必须实现javax.servlet.Filter,并且必须与filter-name元素中的名称相同。阅读Javadoc for DelegatingFilterProxy了解更多信息 因此,如果我从中删除此文件web.xml,将会发生什么?我的servlet无法与Spring容器通信?**


13
如何修复Hibernate LazyInitializationException:无法延迟初始化角色集合,无法初始化代理-没有会话
在我的spring项目的自定义AuthenticationProvider中,我尝试读取已记录用户的权限列表,但遇到以下错误: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.horariolivre.entity.Usuario.autorizacoes, could not initialize proxy - no Session at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:566) at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:186) at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:545) at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:124) at org.hibernate.collection.internal.PersistentBag.iterator(PersistentBag.java:266) at com.horariolivre.security.CustomAuthenticationProvider.authenticate(CustomAuthenticationProvider.java:45) at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:156) at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:177) at org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter.attemptAuthentication(UsernamePasswordAuthenticationFilter.java:94) at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:211) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:57) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) …

6
如何在Spring Security / SpringMVC中手动设置经过身份验证的用户
新用户提交“新帐户”表单后,我想手动登录该用户,这样他们就不必在后续页面上登录。 通过spring安全拦截器的普通表单登录页面工作正常。 在新帐户形式的控制器中,我正在创建一个UsernamePasswordAuthenticationToken并在SecurityContext中手动进行设置: SecurityContextHolder.getContext().setAuthentication(authentication); 稍后,我在同一页面上检查用户的登录身份: SecurityContextHolder.getContext().getAuthentication().getAuthorities(); 这将返回我之前在身份验证中设置的权限。一切都很好。 但是,在我加载的下一页上调用相同的代码时,身份验证令牌只是UserAnonymous。 我不清楚为什么它没有保留我在上一个请求中设置的身份验证。有什么想法吗? 可能与会话ID设置不正确有关吗? 是否有某种方式可能会覆盖我的身份验证? 也许我还需要保存身份验证的另一步骤? 还是我需要做一些事情来在整个会话中声明身份验证,而不是某种程度上的单个请求? 只是寻找一些想法可以帮助我了解这里发生的事情。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.