GVKun编程网logo

如何在JSP页面中配置Spring Security以允许使用hasPermission?(jsp允许使用plugin指令来自定义标签库)

27

对于想了解如何在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指令来自定义标签库)

如何在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管理

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/invalidURL上。

 

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”是过时的“编译错误?

asp.net – 如何修复“System.Security.Permissions.SecurityAction.RequestMinimum”是过时的“编译错误?

从.NET 3.5升级某些ASP.NET代码时,我收到以下编译警告作为错误:
‘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”枚举?

或者,是否有更好的方法来应用此安全属性?

解决方法

您是否阅读完整的编译器警告或访问其包含的链接? “裸”CLR不再限制在.NET 4.0下的CAS权限,除非您翻转“传统模式”开关,因此您的RequestMinimum使用没有替代.程序集级SecurityPermissionAttribute应该被删除,不被修改.

有关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()不允许匿名访问

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吗?

java – 有人可以解释Spring Security BasePermission.Create吗?

我正在开发一个涉及 Spring Security ACL的项目,我遇到了创建权限BasePermission.CREATE.有人请解释这应该如何工作或它允许某人做什么?

我的理解是每个对象都有一个acl,每个acl都有很多ace,每个ace都有一个sid和一个权限.如果必须创建一个对象以便将acl附加到它,那么如何授予对象创建它的权限?

解决方法

Spring安全性通过 ObjectIdentity接口间接授予域对象的权限.

正如您所提到的,到目前为止,通常的情况是您首先创建或获取域对象,然后为域对象构造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吗?等相关内容,可以在本站寻找。

本文标签: