对于想了解如何在JSP页面中配置SpringSecurity以允许使用hasPermission?的读者,本文将提供新的信息,我们将详细介绍jsp允许使用plugin指令来自定义标签库,并且为您提供关
对于想了解如何在JSP页面中配置Spring Security以允许使用hasPermission?的读者,本文将提供新的信息,我们将详细介绍jsp允许使用plugin指令来自定义标签库,并且为您提供关于8. Spring Boot中Spring Security Session管理、asp.net – 如何修复“System.Security.Permissions.SecurityAction.RequestMinimum”是过时的“编译错误?、java – Spring Security permitAll()不允许匿名访问、java – 有人可以解释Spring Security BasePermission.Create吗?的有价值信息。
本文目录一览:- 如何在JSP页面中配置Spring Security以允许使用hasPermission?(jsp允许使用plugin指令来自定义标签库)
- 8. Spring Boot中Spring Security Session管理
- asp.net – 如何修复“System.Security.Permissions.SecurityAction.RequestMinimum”是过时的“编译错误?
- java – Spring Security permitAll()不允许匿名访问
- java – 有人可以解释Spring Security BasePermission.Create吗?
如何在JSP页面中配置Spring Security以允许使用hasPermission?(jsp允许使用plugin指令来自定义标签库)
我正在尝试从spring项目的jsp页面中使用hasPermission。我已经在我的控制器/服务类的方法中毫无问题地使用了它。阅读文章:
http://docs.spring.io/spring-
security/site/docs/4.0.0.M1/reference/htmlsingle/#the-accesscontrollist-
tag
从官方文档中,我了解到,为此,我将需要实现一个从DefaultPermission派生的类,该类将从自定义AclService类加载。
我的问题是我找不到有关如何实现所有这些类的任何信息,甚至不知道这种方法是唯一的还是我以正确的方式理解了该主题(官方文档对此主题非常简短)
,而在互联网的其余部分,我找不到更多信息)。
任何人都可以在这里指出正确的方向吗?也许指示一些教程或代码示例。
更新
从StackOverflow读取其他主题,我发现了这种建议:
This is what I have done. I created my own permission evaulator:
> public class MyPermissionEvaluator implements PermissionEvaluator {> ...> }
Then I configured spring to use that evaulator via
> <beans:bean id="expressionHandler">>> <beans:property name="permissionEvaluator" ref="permissionEvaluator"/>> </beans:bean>> > <beans:bean id="webExpressionHandler" >>> <beans:property name="permissionEvaluator" ref="permissionEvaluator"/>> </beans:bean>> > <beans:bean id="permissionEvaluator"/>
That way all expression handlers have access to my evaulator.Then, in JSP (actually, I am using jspx), I can make tags like this:
> <sec:authorize access="hasPermission(#childUnit, ''read'')">> ...> </sec:authorize>
Hope that gets you heading in the right direction.
因为我已经有一个Custom
PermissionEvaluator,所以我尝试了这种方法。它可以部分工作,但是现在,即使在用户具有权限的情况下,也不会显示标记内的元素。同样,日食表示与此标签有关的错误(“令牌语法错误,构造位置错误”),尽管正在构建和执行应用程序而没有错误。
在控制台中,显示此错误:
un 03, 2014 7:48:40 PM org.springframework.security.access.expression.DenyAllPermissionEvaluator hasPermissionAdvertência: Denying user klebermo permission ''cadastra_usuario'' on object nullJun 03, 2014 7:48:40 PM org.springframework.security.access.expression.DenyAllPermissionEvaluator hasPermissionAdvertência: Denying user klebermo permission ''altera_usuario'' on object nullJun 03, 2014 7:48:40 PM org.springframework.security.access.expression.DenyAllPermissionEvaluator hasPermissionAdvertência: Denying user klebermo permission ''remove_usuario'' on object nullJun 03, 2014 7:48:45 PM org.springframework.security.access.expression.DenyAllPermissionEvaluator hasPermissionAdvertência: Denying user klebermo permission ''cadastra_permissao'' on object nullJun 03, 2014 7:48:45 PM org.springframework.security.access.expression.DenyAllPermissionEvaluator hasPermissionAdvertência: Denying user klebermo permission ''altera_permissao'' on object nullJun 03, 2014 7:48:45 PM org.springframework.security.access.expression.DenyAllPermissionEvaluator hasPermissionAdvertência: Denying user klebermo permission ''remove_permissao'' on object nullJun 03, 2014 7:48:57 PM org.springframework.security.access.expression.DenyAllPermissionEvaluator hasPermissionAdvertência: Denying user klebermo permission ''cadastra_usuario'' on object nullJun 03, 2014 7:48:57 PM org.springframework.security.access.expression.DenyAllPermissionEvaluator hasPermissionAdvertência: Denying user klebermo permission ''altera_usuario'' on object nullJun 03, 2014 7:48:57 PM org.springframework.security.access.expression.DenyAllPermissionEvaluator hasPermissionAdvertência: Denying user klebermo permission ''remove_usuario'' on object null
在Internet上,我发现有些文章表示我应该为WebSecurityExpressionHandler实现接口。
有人知道这里正确的步骤吗?
更新2
以前,我使用此标签:
<sec:accesscontrollist hasPermission="1,2" domainObject="${someObject}">
如果用户在给定对象上具有由值“ 1”或“ 2”表示的任一权限,则将显示此信息。
</sec:accesscontrollist>
在控制台中未显示任何错误的位置,但仍然无法正常工作。我的问题是我需要实现哪个对象来为标签的domainObject分配属性?
答案1
小编典典您CustomPermissionEvaluator
的电话未被呼叫。
尝试在SecurityConfig.java中遵循以下代码。
...import org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler;...public class SecurityConfig extends WebSecurityConfigurerAdapter { ... @Override public void configure(WebSecurity web) throws Exception { DefaultWebSecurityExpressionHandler handler = new DefaultWebSecurityExpressionHandler(); handler.setPermissionEvaluator(new CustomPermissionEvaluator()); web.expressionHandler(handler); }}
Web应用程序初始化器
...import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;...public class AnnotationConfigDispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { return new Class[] { SecurityConfig.class, }; }}
8. Spring Boot中Spring Security Session管理
用户登录成功后,信息保存在服务器Session中,这节学习下如何管理这些Session。这节将在Spring Security短信验证码登录的基础上继续扩展。
Session超时设置
Session超时时间也就是用户登录的有效时间。要设置Session超时时间很简单,只需要在配置文件中添加:
server:
servlet:
session:
timeout: 3600
单位为秒,通过上面的配置,Session的有效期为一个小时。
值得注意的是,Session的最小有效期为60秒,也就是说即使你设置为小于60秒的值,其有效期还是为60秒。查看
TomcatServletWebServerFactory 的源码即可发现原因:
org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
Session失效后,刷新页面后将跳转到认证页面,我们可以再添加一些配置,自定义Session失效后的一些行为。
在Spring Security中配置Session管理器,并配置Session失效后要跳转的URL:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.addFilterBefore(validateCodeFilter, UsernamePasswordAuthenticationFilter.class) // 添加验证码校验过滤器
.addFilterBefore(smsCodeFilter, UsernamePasswordAuthenticationFilter.class) // 添加短信验证码校验过滤器
.formLogin() // 表单登录
.loginPage("/authentication/require") // 登录跳转 URL
.loginProcessingUrl("/login") // 处理表单登录 URL
.successHandler(authenticationSucessHandler)//处理登录成功
.failureHandler(authenticationFailureHandler)//处理登录失败
.and()
.rememberMe()
.tokenRepository(persistentTokenRepository()) // 配置 token 持久化仓库
.tokenValiditySeconds(3600) // remember 过期时间,单为秒
.userDetailsService(userDetailService) // 处理自动登录逻辑
.and()
.authorizeRequests() // 授权配置
.antMatchers("/authentication/require", "/login.html", "/code/image","/code/sms","/session/invalid").permitAll() // 登录跳转 URL 无需认证
.anyRequest() // 所有请求
.authenticated() // 都需要认证
.and()
.sessionManagement() // 添加 Session管理器
.invalidSessionUrl("/session/invalid") // Session失效后跳转到这个链接
.and().csrf().disable()
.apply(smsAuthenticationConfig);// 将短信验证码认证配置加到 Spring Security 中
}
上面配置了Session失效后跳转到/session/invalid
,并且将这个URL添加到了免认证路径中。
在Controller里添加一个方法,映射该请求:
@GetMapping("/session/invalid")
@ResponseStatus(HttpStatus.UNAUTHORIZED)
public String sessionInvalid(){
return "session已失效,请重新认证";
}
我们将Session的超时时间设置为最小值60秒,重启项目,认证后等待60秒并刷新页面:
可看到请求跳转到了我们自定义的/session/invalid
URL上。
Session并发控制
Session并发控制可以控制一个账号同一时刻最多能登录多少个。我们在Spring Security配置中继续添加Session相关配置:
@Autowired
private MySessionExpiredStrategy sessionExpiredStrategy;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.addFilterBefore(validateCodeFilter, UsernamePasswordAuthenticationFilter.class) // 添加验证码校验过滤器
.addFilterBefore(smsCodeFilter, UsernamePasswordAuthenticationFilter.class) // 添加短信验证码校验过滤器
.formLogin() // 表单登录
.loginPage("/authentication/require") // 登录跳转 URL
.loginProcessingUrl("/login") // 处理表单登录 URL
.successHandler(authenticationSucessHandler)//处理登录成功
.failureHandler(authenticationFailureHandler)//处理登录失败
.and()
.rememberMe()
.tokenRepository(persistentTokenRepository()) // 配置 token 持久化仓库
.tokenValiditySeconds(3600) // remember 过期时间,单为秒
.userDetailsService(userDetailService) // 处理自动登录逻辑
.and()
.authorizeRequests() // 授权配置
.antMatchers("/authentication/require", "/login.html", "/code/image","/code/sms","/session/invalid").permitAll() // 登录跳转 URL 无需认证
.anyRequest() // 所有请求
.authenticated() // 都需要认证
.and()
.sessionManagement() // 添加 Session管理器
.invalidSessionUrl("/session/invalid") // Session失效后跳转到这个链接
.maximumSessions(1)
.expiredSessionStrategy(sessionExpiredStrategy)
.and()
.and().csrf().disable()
.apply(smsAuthenticationConfig);// 将短信验证码认证配置加到 Spring Security 中
}
maximumSessions
配置了最大Session并发数量为1个,如果mrbird这个账户登录后,在另一个客户端也使用mrbird账户登录,那么第一个使用mrbird登录的账户将会失效,类似于一个先入先出队列。expiredSessionStrategy
配置了Session在并发下失效后的处理策略,这里为我们自定义的策略MySessionExpiredStrategy
。
MySessionExpiredStrategy
实现SessionInformationExpiredStrategy
:
@Component
public class MySessionExpiredStrategy implements SessionInformationExpiredStrategy {
@Override
public void onExpiredSessionDetected(SessionInformationExpiredEvent event) throws IOException, ServletException {
HttpServletResponse response = event.getResponse();
response.setStatus(HttpStatus.UNAUTHORIZED.value());
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("您的账号已经在别的地方登录,当前登录已失效。如果密码遭到泄露,请立即修改密码!");
}
}
为了演示这个效果,我们先将Session超时时间设置久一点,比如3600秒,然后重启项目,在Chrome里使用admin账户登录。
登录成功后,在firefox上也是用admin账户登录,登录成功后回到chrome,刷新页面,效果如下所示:
除了后者将前者踢出的策略,我们也可以控制当Session达到最大有效数的时候,不再允许相同的账户登录。
要实现这个功能只需要在上面的配置中添加:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.addFilterBefore(validateCodeFilter, UsernamePasswordAuthenticationFilter.class) // 添加验证码校验过滤器
.addFilterBefore(smsCodeFilter, UsernamePasswordAuthenticationFilter.class) // 添加短信验证码校验过滤器
.formLogin() // 表单登录
.loginPage("/authentication/require") // 登录跳转 URL
.loginProcessingUrl("/login") // 处理表单登录 URL
.successHandler(authenticationSucessHandler)//处理登录成功
.failureHandler(authenticationFailureHandler)//处理登录失败
.and()
.rememberMe()
.tokenRepository(persistentTokenRepository()) // 配置 token 持久化仓库
.tokenValiditySeconds(3600) // remember 过期时间,单为秒
.userDetailsService(userDetailService) // 处理自动登录逻辑
.and()
.authorizeRequests() // 授权配置
.antMatchers("/authentication/require", "/login.html", "/code/image","/code/sms","/session/invalid").permitAll() // 登录跳转 URL 无需认证
.anyRequest() // 所有请求
.authenticated() // 都需要认证
.and()
.sessionManagement() // 添加 Session管理器
.invalidSessionUrl("/session/invalid") // Session失效后跳转到这个链接
.maximumSessions(1)
.maxSessionsPreventsLogin(true)
.expiredSessionStrategy(sessionExpiredStrategy)
.and()
.and().csrf().disable()
.apply(smsAuthenticationConfig);// 将短信验证码认证配置加到 Spring Security 中
}
重启系统,在chrome上登录admin账户后,在firefox上尝试使用admin账户登录:
可以看到登录受限。
asp.net – 如何修复“System.Security.Permissions.SecurityAction.RequestMinimum”是过时的“编译错误?
‘System.Security.Permissions.SecurityAction.RequestMinimum’已经过时了.
该属性具有应用于assebly级别的蜜蜂:
[assembly: System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.RequestMinimum,Execution=true)]
此外,该代码也利用了P& P Web Client Software Factory,特别是ObjectBuilder.WCSFExtensions库.
代码也提供了一些角色提供者的实现.
请记住,此代码用作其他项目中的框架代码,因此很难确定可能存在的安全需求.
所以极限的问题是:
什么值需要用于“System.Security.Permissions.SecurityAction”枚举?
或者,是否有更好的方法来应用此安全属性?
解决方法
有关MSDN上显示的4.0 CAS更改的更完整的说明,请参阅http://blogs.msdn.com/b/shawnfa/archive/2009/05/21/security-policy-in-the-v4-clr.aspx和http://blogs.msdn.com/b/shawnfa/archive/2010/02/24/so-is-cas-dead-in-net-4-or-what.aspx.
java – Spring Security permitAll()不允许匿名访问
我使用Spring Security 3.2.4与基于java的配置.
重写的配置方法(在我的自定义配置类扩展WebSecurityConfigurerAdapter)中具有以下http块:
http .addFilterBefore(muiltpartFilter,ChannelProcessingFilter.class) .addFilterBefore(cf,ChannelProcessingFilter.class) .authorizeRequests() .anyRequest() .authenticated() .and() .authorizeRequests() .antMatchers("/ping**") .permitAll() .and() .formLogin() .loginPage("/login") .permitAll() .and() .logout() .logoutUrl("/logout") .logoutSuccessUrl("/login");
ping请求处理程序和方法在一个还包含登录处理程序的控制器中,并且没有单独的@PreAuthorize或其他可能导致问题的注释.
问题是匿名访问被拒绝,用户被重定向到登录页面.
在调试级别登录时,我会看到Spring Security提供的以下反馈信息:
[2014-07-11 13:18:04,483] [DEBUG] [org.springframework.security.web.access.intercept.FilterSecurityInterceptor] Secure object: FilterInvocation: URL: /ping; Attributes: [authenticated] [2014-07-11 13:18:04,483] [DEBUG] [org.springframework.security.web.access.intercept.FilterSecurityInterceptor] PrevIoUsly Authenticated: org.springframework.security.authentication.AnonymousAuthenticationToken@6faad796: Principal: anonymousUser; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@ffffa64e: RemoteIpAddress: 192.168.2.128; SessionId: 0EF6B13BBA5F00C020FF9C35A6E3FBA9; Granted Authorities: ROLE_ANONYMOUS [2014-07-11 13:18:04,483] [DEBUG] [org.springframework.security.access.Vote.AffirmativeBased] Voter: org.springframework.security.web.access.expression.WebExpressionVoter@123f2882,returned: -1 [2014-07-11 13:18:04,483] [DEBUG] [org.springframework.security.web.access.ExceptionTranslationFilter] Access is denied (user is anonymous); redirecting to authentication entry point
我想要完成的是具有可以在任何时候调用的方法,并且将发送一个回复,指示请求是否在登录的会话内.
解决方法
.authorizeRequests() .antMatchers("/ping**") .permitAll() .and() .authorizeRequests() .anyRequest() .authenticated() .and()
java – 有人可以解释Spring Security BasePermission.Create吗?
我的理解是每个对象都有一个acl,每个acl都有很多ace,每个ace都有一个sid和一个权限.如果必须创建一个对象以便将acl附加到它,那么如何授予对象创建它的权限?
解决方法
正如您所提到的,到目前为止,通常的情况是您首先创建或获取域对象,然后为域对象构造ObjectIdentityImpl:
MyDomainObject secured = new MyDomainObject(); ObjectIdentity securedIdentity = new ObjectIdentityImpl(secured);
然后使用ObjectIdentity实例使用spring安全框架检索ACL.
但是,这不是使用对象标识的唯一方法.您可以传递对不是实际业务对象的objectIdentity的引用,但是如果已创建,则可以使用某种方法来标识它.
例如,想象一下我们想要保护文件.我们可以使用受保护的java.io.File实例创建ObjectItentity.身份中的File对象只是对文件的引用 – 它不是实际文件 – 文件可能甚至不存在,但我们有一个ObjectIdentity,然后我们可以推断安全性并获取ACL.
此模式可以应用于任何类型的域对象.创建一个DomainObjectPrototype实现,该实现根据保护域对象所需的域功能来描述域对象,但实际上并不需要对域对象的引用.您可以将此视为某些服务实际创建该域对象所需的详细信息.
PS:让我承认我从未使用过弹簧安全装置,但看完example之后我的设计模式似乎很清楚.
编辑:我已经更新了这个以希望更清楚 – 没有必要创建ObjectIdentity的实现,因为我原来写的.
关于如何在JSP页面中配置Spring Security以允许使用hasPermission?和jsp允许使用plugin指令来自定义标签库的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于8. Spring Boot中Spring Security Session管理、asp.net – 如何修复“System.Security.Permissions.SecurityAction.RequestMinimum”是过时的“编译错误?、java – Spring Security permitAll()不允许匿名访问、java – 有人可以解释Spring Security BasePermission.Create吗?等相关内容,可以在本站寻找。
本文标签: