标签: spring-security

使用Spring Security时,获取bean中当前用户名(即SecurityContext)信息的正确方法是什么?

我有一个使用Spring Security的Spring MVC Web应用程序.我想知道当前登录用户的用户名.我正在使用下面给出的代码段.这是接受的方式吗?

我不喜欢在这个控制器中调用静态方法 - 这违背了Spring的全部目的,恕我直言.有没有办法配置应用程序以注入当前的SecurityContext或当前的身份验证?

  @RequestMapping(method = RequestMethod.GET)
  public ModelAndView showResults(final HttpServletRequest request...) {
    final String currentUser = SecurityContextHolder.getContext().getAuthentication().getName();
    ...
  }
Run Code Online (Sandbox Code Playgroud)

java spring spring-mvc spring-security

280
推荐指数
9
解决办法
17万
查看次数

通过Spring进行RESTful身份验证

问题:
我们有一个基于Spring MVC的RESTful API,它包含敏感信息.应该保护API,但是不希望向每个请求发送用户的凭证(用户/通过组合).根据REST准则(和内部业务要求),服务器必须保持无状态.API将由mashup风格的方法由另一台服务器使用.

要求:

  • 客户端.../authenticate使用凭据向(未受保护的URL)发出请求; 服务器返回一个安全令牌,其中包含足够的信息,供服务器验证将来的请求并保持无状态.这可能包含与Spring Security的Remember-Me Token相同的信息.

  • 客户端对各种(受保护的)URL进行后续请求,将先前获得的令牌附加为查询参数(或者不太希望的是HTTP请求头).

  • 不能指望客户存储cookie.

  • 由于我们已经使用Spring,因此该解决方案应该使用Spring Security.

我们一直在试图让这项工作碰壁,所以希望那里的人已经解决了这个问题.

鉴于上述情况,您如何解决这一特殊需求?

java rest spring spring-mvc spring-security

253
推荐指数
3
解决办法
12万
查看次数

Spring Security中角色与GrantedAuthority的区别

有概念和实现Spring Security的,如GrantedAuthority界面得到一个权威授权/控制的访问.

我希望这是允许的操作,例如createSubUsersdeleteAccounts,我允许管理员(带角色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)
Run Code Online (Sandbox Code Playgroud)

或者还有其他方法可以区分其他两个吗?或者它不受支持,我们必须自己制作?

java spring spring-mvc spring-security

209
推荐指数
4
解决办法
10万
查看次数

Wildfly上的Spring Security:执行过滤器链时出错

我正在尝试将Spring Security SAML ExtensionSpring Boot集成.

关于这件事,我确实开发了一个完整的示例应用程序.它的源代码可以在GitHub上找到:

通过将其作为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 simulating the data access.
            LOG.warn("SSO User Account not found into the system");
            throw new SSOUserAccountNotExistsException("SSO User Account not found into …
Run Code Online (Sandbox Code Playgroud)

spring spring-security wildfly undertow spring-saml

193
推荐指数
1
解决办法
7368
查看次数

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]
Run Code Online (Sandbox Code Playgroud)

这是我的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>
Run Code Online (Sandbox Code Playgroud)

在我的pom.xml中,我有:

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-core</artifactId>      
    <version>3.0.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-openid</artifactId>
    <version>3.0.1.RELEASE</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

java spring maven-2 spring-security

176
推荐指数
5
解决办法
16万
查看次数

如何获取活动用户的UserDetails

在我的控制器中,当我需要活动(登录)用户时,我正在执行以下操作来获取我的UserDetails实现:

User activeUser = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
log.debug(activeUser.getSomeCustomField());
Run Code Online (Sandbox Code Playgroud)

它工作正常,但我认为Spring可以在这样的情况下让生活更轻松.有没有办法将UserDetails自动装配到控制器或方法?

例如,类似于:

public ModelAndView someRequestHandler(Principal principal) { ... }
Run Code Online (Sandbox Code Playgroud)

但是,而不是得到UsernamePasswordAuthenticationToken,我得到了一个UserDetails

我正在寻找一个优雅的解决方案.有任何想法吗?

java spring spring-mvc spring-security

165
推荐指数
6
解决办法
12万
查看次数

主题,用户和委托人之间的含义和区别是什么?

在安全框架的背景下,一些术语通常出现在主题,用户主体上,但我无法找到明确的定义和它们之间的区别.

那么,这些术语究竟是什么意思,为什么需要这些主题主体的区别呢?

java security terminology spring-security

159
推荐指数
6
解决办法
4万
查看次数

春季安全3中@ secure和@PreAuthorize的区别是什么?

我不清楚弹簧安全性的区别在于:

 @PreAuthorize("hasRole('ROLE_USER')")
 public void create(Contact contact)
Run Code Online (Sandbox Code Playgroud)

@Secured("ROLE_USER")
public void create(Contact contact)
Run Code Online (Sandbox Code Playgroud)

我知道PreAuthorize可以与spring el合作,但在我的样本中,是否有真正的区别?

spring-security

136
推荐指数
5
解决办法
5万
查看次数

Shiro vs. SpringSecurity

我目前正在评估基于Java的安全框架,我是一个Spring 3.0用户,所以SpringSecurity似乎是正确的选择,但Spring安全性似乎过于复杂,它似乎并不像是让安全性更容易实现, Shiro似乎更连贯,更容易理解.我正在寻找这两个框架之间的利弊列表.

java spring spring-security shiro

132
推荐指数
3
解决办法
4万
查看次数

使用Spring Security进行单元测试

我的公司一直在评估Spring MVC,以确定我们是否应该在下一个项目中使用它.到目前为止,我喜欢我所看到的内容,现在我正在查看Spring Security模块,以确定它是否可以/应该使用.

我们的安全要求非常基本; 用户只需提供用户名和密码即可访问网站的某些部分(例如获取有关其帐户的信息); 并且网站上有一些页面(常见问题解答,支持等),应该授予匿名用户访问权限.

在我创建的原型中,我一直在Session中为经过身份验证的用户存储"LoginCredentials"对象(其中只包含用户名和密码); 例如,某些控制器检查此对象是否在会话中以获取对登录用户名的引用.我正在寻找用Spring Security取代这个本土逻辑,这将有很好的好处,可以删除任何类型的"我们如何跟踪登录用户?" 和"我们如何验证用户?" 来自我的控制器/业务代码.

似乎Spring Security提供了一个(每个线程)"上下文"对象,可以从应用程序的任何位置访问用户名/主体信息...

Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
Run Code Online (Sandbox Code Playgroud)

...在某种程度上,这个对象是一个(全局)单例,这似乎非常不像Spring.

我的问题是:如果这是在Spring Security中访问有关经过身份验证的用户的信息的标准方法,那么将Authentication对象注入SecurityContext的可接受方式是什么,以便在单元测试需要时可用于我的单元测试认证用户?

我是否需要在每个测试用例的初始化方法中进行连接?

protected void setUp() throws Exception {
    ...
    SecurityContextHolder.getContext().setAuthentication(
        new UsernamePasswordAuthenticationToken(testUser.getLogin(), testUser.getPassword()));
    ...
}
Run Code Online (Sandbox Code Playgroud)

这似乎过于冗长.有没有更简单的方法?

SecurityContextHolder物体本身似乎非常联合国春天般的...

java security spring unit-testing spring-security

131
推荐指数
6
解决办法
8万
查看次数