我需要找到那些登录我们的应用程序的用户.
我们正在使用Spring Security,必须有办法找出用户的IP.
我认为这些信息存储在他们的会话中.在Spring Security中,当前会话存储在SessionRegistry中.从这个类我可以有经过身份验证的用户列表和一些会话信息.(使用getAllPrincipals,getAllSessions和getSessionInformation)
的问题是,我怎么能有机会获得当前用户的IP地址?考虑我们必须仅为已知区域提供服务.
该SessionInformation没有太大的帮助,因为它并不包含太多的信息.
我正在寻找一种非侵入性的方法来为某些api调用添加验证码过滤器.
我的设置包括两个WebSecurityConfigurerAdapters,每个都有一个过滤器(不是验证码过滤器):
如何在Spring Security内容,公共内部api或外部api调用之前添加过滤器?我不需要SecurityContext,只需要检查请求头中的Captcha,转发到filterChain(普通过滤器)或手动拒绝访问.我尝试在web.xml中声明一个过滤器,但这会破坏使用依赖注入的能力.
这是我的Spring安全配置:
@EnableWebSecurity
public class SpringSecurityConfig {
@Configuration
@Order(1)
@EnableGlobalMethodSecurity(securedEnabled = true)
public static class InternalApiConfigurerAdapter extends WebSecurityConfigurerAdapter {
@Autowired
private Filter filterA;
public InternalApiConfigurerAdapter() {
super(true);
}
@Override
public void configure(WebSecurity web) throws Exception {
web
.ignoring()
.antMatchers("/public/**");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/iapi/**")
.exceptionHandling().and()
.anonymous().and()
.servletApi().and()
.authorizeRequests()
.anyRequest().authenticated().and()
.addFilterBefore(filterA, (Class<? extends Filter>) UsernamePasswordAuthenticationFilter.class);
}
@Override
@Bean
public …Run Code Online (Sandbox Code Playgroud) 我是Spring Security 3的新手.我正在使用角色供用户登录.
我想在用户被授权进入应用程序后添加一些会话值.也许我需要一些过滤器,以便重定向到我的方法,这会增加一些会话值.我已经配置了我的security.xml文件,但我不确定我是否正在做正确的事情.这方面的任何例子都会有所帮助.我应该使用哪种过滤器类?我应该如何配置security.xml文件?
<custom-filter ref="authenticationFilter" after="FORM_LOGIN_FILTER "/>
<beans:bean id="authenticationFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
<beans:property name="filterProcessesUrl" value="/j_spring_security_check" />
<beans:property name="authenticationManager" ref="authenticationManager" />
<beans:property name="authenticationSuccessHandler" ref="successHandler" />
</beans:bean>
<beans:bean id="successHandler" class="org.dfci.sparks.datarequest.security.CustomAuthorizationFilter"/>
Run Code Online (Sandbox Code Playgroud)
我的过滤器类方法我需要添加一些会话值.
public class CustomAuthorizationFilter implements AuthenticationSuccessHandler {
@Override
public void onAuthenticationSuccess(HttpServletRequest request,
HttpServletResponse response, Authentication authentication)
throws IOException, ServletException {
Set<String> roles = AuthorityUtils.authorityListToSet(authentication
.getAuthorities());
if (roles.contains("ROLE_USER")) {
request.getSession().setAttribute("myVale", "myvalue");
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑代码
我修改了我的security.xml文件和类文件
<custom-filter ref="authenticationFilter" after="FORM_LOGIN_FILTER "/>
Run Code Online (Sandbox Code Playgroud)
public class CustomAuthorizationFilter extends GenericFilterBean {
/*
* ServletRequestAttributes attr = (ServletRequestAttributes)
* RequestContextHolder.currentRequestAttributes(); …Run Code Online (Sandbox Code Playgroud) 在我之前的工作中,我遇到了一个众所周知的问题,即无法阻止用户在退出后使用后退按钮导航网站.我的技术包括Spring,JavaScript以及Java AJAX库ZK的Mobile模块.除了使用后退按钮导航外,授权访问也起作用.我无法再访问应用程序代码.该应用程序是移动应用程序,我不是原作者.
我尝试了以下常见解决方案:
WebContentInterceptor(按照此处的说明)RequestMappingHandlerAdapter到设置cacheSeconds为0
我们在以下定义中t2-spring-security-context.xml:
<http auto-config="true">
<intercept-url pattern="/mobile-index*" access="ROLE_ADMIN"/>
<intercept-url pattern="/t2-metrics*" access="ROLE_ADMIN"/>
<intercept-url pattern="/t2-monitor*" access="ROLE_ADMIN"/>
<form-login login-page="/login.jsp" authentication-failure-url="/loginerror.jsp"
default-target-url="/mobile-index.jsp"/>
<logout logout-success-url="/login.jsp" invalidate-session="true"/>
</http>
Run Code Online (Sandbox Code Playgroud)
其他有关我们实施的细节:
@RequestMapping在注释为的类上使用JavaScript 调用Java方法@Controller(IE t2-metrics.jsp具有JS以触发URL匹配请求映射)security:global-method-security方法添加应用程序上下文和角色注释我唯一的想法是,问题涉及我们的客户端代码(JavaScript)或库(与Spring安全性的错误集成),因为调试没有达到Spring Security过滤器链.
我正在使用Spring-Security 3.2.4和Spring Boot 1.1.0(以及相关的依赖版本4.X).我正在编写一个将在嵌入式tomcat中运行的Web应用程序.
我正在尝试添加两个额外的过滤器(与Spring安全无关),其中一个将在Spring-Security-FilterChainProxy之前调用,另一个将在Spring-Security-FilterChainProxy之后调用.
我的Spring-Security配置文件:
@Configuration
@EnableWebMvcSecurity
public class SecurityCtxConfig extends WebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.withUser("user").password("pass").roles("USER");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf()
.disable()
.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.formLogin()
.usernameParameter("user").passwordParameter("password");
}
}
Run Code Online (Sandbox Code Playgroud)
和Main类(Application.class):
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {
@Bean
RequestFilter beforeSpringSecurityFilter(){
return new RequestFilter();
}
@Bean
RequestFilter afterSpringSecurityFilter(){
return new RequestFilter();
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Run Code Online (Sandbox Code Playgroud)
和Filter实现:
public class RequestFilter …Run Code Online (Sandbox Code Playgroud) spring ×4
spring-mvc ×2
captcha ×1
ip ×1
java ×1
javascript ×1
mobile ×1
session ×1
spring-boot ×1