- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在开发一个 Spring-MVC 应用程序,该应用程序使用 Spring-Security 进行身份验证和相关的安全目的。目前,我在查询 sessionRegistry 以获取当前在线用户的列表时遇到问题,因为 getAllPrincipals() 方法始终包含 NULL。我尝试了文档中提到的解决方案以及其他 SO 线程中提到的许多建议。我真的很感激一些帮助,因为我正在尝试各种组合,这将有助于获取所有在线用户的列表。
这是我的 security-application-context.xml:
<import resource="servlet-context.xml" />
<!-- Global Security settings -->
<security:global-method-security pre-post-annotations="enabled" />
<security:http pattern="/resources/**" security="none"/>
<security:http create-session="ifRequired" use-expressions="true" auto-config="false" disable-url-rewriting="true">
<security:form-login login-page="/login" login-processing-url="/j_spring_security_check" default-target-url="/canvas/list" always-use-default-target="false" authentication-failure-url="/denied.jsp" />
<security:remember-me key="_spring_security_remember_me" user-service-ref="userDetailsService" token-validity-seconds="1209600" data-source-ref="dataSource"/>
<security:logout delete-cookies="JSESSIONID" invalidate-session="true" logout-url="/j_spring_security_logout"/>
<security:port-mappings>
<security:port-mapping http="80" https="443"/>
</security:port-mappings>
<security:logout logout-url="/logout" logout-success-url="/" success-handler-ref="myLogoutHandler"/>
</security:http>
<bean id="sessionRegistry" class="org.springframework.security.core.session.SessionRegistryImpl" />
<beans:bean id="sas" class="org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy">
<beans:constructor-arg name="sessionRegistry" ref="sessionRegistry" />
<beans:property name="maximumSessions" value="-1" />
</beans:bean>
<beans:bean id="rememberMeAuthenticationProvider" class="org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices">
<beans:property name="key" value="_spring_security_remember_me" />
<property name="alwaysRemember" value="true"/>
<beans:property name="tokenRepository" ref="jdbcTokenRepository"/>
<beans:property name="userDetailsService" ref="LoginServiceImpl"/>
</beans:bean>
<beans:bean id="myAuthFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
<property name="sessionAuthenticationStrategy" ref="sas"/>
<property name="rememberMeServices" ref="rememberMeAuthenticationProvider"/>
<property name="allowSessionCreation" value="true"/>
<property name="authenticationManager" ref="authenticationManager"/>
</beans:bean>
<security:authentication-manager alias="authenticationManager">
<security:authentication-provider user-service-ref="LoginServiceImpl">
<security:password-encoder ref="encoder"/>
</security:authentication-provider>
</security:authentication-manager>
<beans:bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder">
<beans:constructor-arg name="strength" value="11" />
</beans:bean>
<beans:bean id="daoAuthenticationProvider"
class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
<beans:property name="userDetailsService" ref="LoginServiceImpl"/>
<beans:property name="passwordEncoder" ref="encoder"/>
</beans:bean>
这是我试图取回 OnlineUsers 列表的地方:
@Service
@Transactional
public class OnlineUsersServiceImpl implements OnlineUsersService {
@Autowired
@Qualifier("sessionRegistry")
private SessionRegistry sessionRegistry;
@Override
public boolean checkIfUserhasSession(int id) {
Person person = this.personService.getPersonById(id);
String email = person.getUsername();
List<Object> principals = sessionRegistry.getAllPrincipals();
for (Object principal : principals) {
// It never reaches here
System.out.println("We reached here");
if (principal instanceof User) {
String username = ((User) principal).getUsername();
System.out.println("Username is "+username);
if(email.equals(username)){
return true;
}
}
}
return false;
}
任何帮助都会很好。因为我已经在这件绝望的事情上待了 3-4 天了。
最佳答案
在注入(inject) session 注册表之前,您需要在 security-application-context.xml 中定义 session 管理部分
在并发控制部分,您应该为 session 注册表对象设置别名
<security:http access-denied-page="/error403.jsp" use-expressions="true" auto-config="false">
<security:session-management session-fixation-protection="migrateSession" session-authentication-error-url="/login.jsp?authFailed=true">
<security:concurrency-control max-sessions="1" error-if-maximum-exceeded="true" expired-url="/login.html" session-registry-alias="sessionRegistry"/>
</security:session-management>
...
</security:http>
For java based configuration alternative to xml configuration
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(final HttpSecurity http) throws Exception {
// ...
http.sessionManagement().maximumSessions(1).sessionRegistry(sessionRegistry());
}
@Bean
public SessionRegistry sessionRegistry() {
return new SessionRegistryImpl();
}
@Bean
public ServletListenerRegistrationBean<HttpSessionEventPublisher> httpSessionEventPublisher() {
return new ServletListenerRegistrationBean<HttpSessionEventPublisher>(new HttpSessionEventPublisher());
}
}
关于java - Spring-Security : SecurityContextHolder not populated with anonymous token, 因为它已经包含,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30162665/
回答这个问题securitycontextholder-session-or-request-bound 。我正在使用此示例 how-to-customAuthenticationManager 实现
我使用 SecurityContextHolder 和自定义 UserDetailsService 从 SecurityContextHolder 获取 UserDetails: Object o
我有登录参数 1.userName 2.password 3.companyId 我使用以下代码获得了用户名和密码 Authentication auth = SecurityContextHold
我正在尝试在Spring Boot应用程序中使用Spring Security添加Facebook授权。目前,我的问题是从Principal提取数据。 这是我的安全配置: public class S
我使用这样的代码进行身份验证: @PreAuthorize("isAnonymous()") @RequestMapping(value = "/login", method = RequestMet
我正在阅读 Spring Security 文档,它说 SecurityContextHolder 为具有特定线程行为的应用程序提供了不同类型的策略。例如 - Swing 应用程序。 我知道在网络应用
我遇到了 SecurityContextHolder.getContext().getAuthentication() 的问题,它是 null。我尝试了很多与注释和示例的组合。 (来自站点的代码在我的
我尝试实现存储所有登录的日志文件。 到目前为止,我在 LoginHandler 中添加了一些代码,但总是收到错误: org.springframework.security.core.userdeta
如何通过将ManualUserDetails扩展org.springframework.security.core.userdetails.UserDetails添加到SecurityContextH
我在我的 Spring Boot 项目中处理安全层时遇到了以下问题: SecurityContextHolder.getContext().getAuthentication() 此代码返回: 匿名用
我正在使用 Spring Security 来验证用户身份。 问题是动态更新权限的最佳方法是什么?我想根据请求更新它,现在我只需在用户登录系统后执行一次。 我有基于经理的应用程序,因此管理员可以随时决
我正在基于一些开源项目和网上找到的一些文档,使用 Spring boot 来实现 JWT。 什么在起作用?我能够生成我的 token ,并且在第一次点击时,当我尝试调用一些安全方法时,我被撤销,这很好
我知道这个问题经常被问到,但也许我有一些特别的事情。我正在尝试对支持 REST(不是 Spring MVC)的 Spring Boot 应用程序进行一些集成测试,出于某种原因 SecurityCont
当我尝试模拟时 SecurityContextHolder.getContext().getAuthentication().getCredentials() 要获得 UserDetails 的 Ma
我创建了一个 @Aspect 类并尝试获取主要对象,例如.. SecurityContextHolder.getContext().getAuthentication() .getPrincipal(
我正在实现 MyUsernamePasswordAuthenticationFilter 扩展默认过滤器。 我没有在其中做任何事情。我只是想在这里获取请求以使其变得简单。 public class M
在我的 spring 应用程序中,我对 Controller 方法有一些方面,我在其中进行一些安全检查。因为我需要更频繁地进行多次检查,所以我将它们包装到“sercurityUtil”类的静态辅助方法
我在我的网络项目中使用 SpringSecurity。我有保存在数据库中的实体用户。我需要使用用户 ID 在 BD 中执行请求,以从该 BD 中的其他表获取任何信息。在 Spring Security
我有两个不同的应用程序,例如 A 和 .两者都使用具有相同配置的 Spring Security。这是我的情况: 我登录到我的 A 应用程序。一切正常。但是,当我在同一浏览器的另一个选项卡中登录我的
我一直在尝试为以下代码行编写测试用例,但我不断收到 java.lang.NullPointerException,我已尝试遵循/复制其他人在此处提出的建议 Unit testing with Spri
我是一名优秀的程序员,十分优秀!