GVKun编程网logo

Spring Security拦截URL模式不起作用(spring security 拦截)

14

本篇文章给大家谈谈SpringSecurity拦截URL模式不起作用,以及springsecurity拦截的知识点,同时本文还将给你拓展@PreAuthorize批注在SpringSecurity中不

本篇文章给大家谈谈Spring Security拦截URL模式不起作用,以及spring security 拦截的知识点,同时本文还将给你拓展@PreAuthorize批注在Spring Security中不起作用、Java Spring Security:多个HTTP配置不起作用、PreAuthorize在Spring Security中不起作用、Spring safety:拦截URL模式access =“#id == 1等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

Spring Security拦截URL模式不起作用(spring security 拦截)

Spring Security拦截URL模式不起作用(spring security 拦截)

我的应用程序可以具有以下URL:

/siteadmin/homepage//siteusers/customer/createCustomer

以下是我的spring-security.xml

<beans:beans>     <http auto-config="true">        <intercept-url pattern="/siteusers***" access="isAuthenticated()" />        <!-- <intercept-url pattern="siteusers/home/*" access="hasRole(''USER'') OR hasRole(''ADMIN'')" /> -->        <intercept-url pattern="/siteadmin***" access="hasRole(''ROLE_ADMIN'')" />`enter code here`        <form-login login-page="/siteusers/loginprocess/login" default-target-url="/siteusers/home/homepage"            login-processing-url="/siteusers/loginprocess/login"            authentication-failure-url="/siteusers/loginprocess/login?error" username-parameter="username"            password-parameter="password" />        <logout logout-success-url="/siteusers/loginprocess/login?logout" logout-url="/siteusers/loginprocess/logout" />        <!-- enable csrf protection -->        <csrf />    </http>    <authentication-manager>        <authentication-provider>            <user-service>                <user name="b" password="123456" authorities="ROLE_ADMIN" />                <user name="a" password="a" authorities="ROLE_USER" /><!-- This user can not access /admin url -->            </user-service>        </authentication-provider>    </authentication-manager></beans:beans>

如果我使用用户’a’登录并点击URL
http://localhost:8080/siteadmin/homepage/,则允许用户’a’查看页面,尽管他的角色不是admin。但是,当我尝试击中时,http://localhost:8080/siteadminSpring
Security可以正常工作。其显示拒绝访问页面。我想限制/admin/*没有Admin角色的用户的URL 。

答案1

小编典典

参见AntPathMatcher:

映射使用以下规则匹配URL:

  • ? 匹配一个字符
  • * 匹配零个或多个字符
  • ** 匹配路径中的零个或多个目录

一些例子:

  • com/t?st.jsp-比赛com/test.jspcom/tast.jsp或者com/txst.jsp
  • com/*.jsp-匹配目录中的所有.jsp文件com
  • com/**/test.jsp-匹配路径test.jsp下的所有文件com
  • org/springframework/**/*.jsp-匹配路径.jsp下的所有文件org/springframework
    *org/**/servlet/bla.jsp-比赛org/springframework/servlet/bla.jsporg/springframework/testing/servlet/bla.jsporg/servlet/bla.jsp

您的图案/siteadmin***缺少斜线。使用/siteadmin/**

@PreAuthorize批注在Spring Security中不起作用

@PreAuthorize批注在Spring Security中不起作用

我发现了许多类似的问题,但都没有解决我的问题。我的问题是ROLE_USER可以访问的功能ROLE_ADMIN

我的spring-security.xml代码如下。

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:s="http://www.springframework.org/schema/security"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                    http://www.springframework.org/schema/security
                    http://www.springframework.org/schema/security/spring-security-3.0.xsd">

<s:http auto-config="true" use-expressions="true">
    <s:intercept-url pattern="/index.jsp" access="permitAll" />
    <s:intercept-url pattern="/welcome*" access="hasRole('ROLE_USER')" />
    <s:intercept-url pattern="/helloadmin*" access="hasRole('ROLE_ADMIN')" />

    <s:form-login login-page="/login" default-target-url="/welcome"
        authentication-failure-url="/loginfailed" />
    <s:logout logout-success-url="/logout" />
</s:http>

<s:authentication-manager>
  <s:authentication-provider>
    <s:user-service>
        <s:user name="asif" password="123456" authorities="ROLE_USER,ROLE_ADMIN" />
        <s:user name="raheel" password="123456" authorities="ROLE_USER" />          
    </s:user-service>
  </s:authentication-provider>
</s:authentication-manager>

当我添加<s:global-method-security pre-post-annotations="enabled"/>
我的代码时显示找不到资源错误,并且当我删除我的代码时成功执行但ROLE_USER可以访问ROLE_ADMIN函数

我的控制器功能是。

@PreAuthorize("hasRole('ROLE_ADMIN')")
@RequestMapping(value="/delete",method = RequestMethod.GET)
public String DeleteAll(ModelMap model,Principal principal ) {

    org.springframework.security.core.userdetails.User activeUser = (org.springframework.security.core.userdetails.User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    System.out.println("Active user is "+activeUser.getUsername()+"Authorities are "+activeUser.getAuthorities());
    return "deleteUsers";

}

Java Spring Security:多个HTTP配置不起作用

Java Spring Security:多个HTTP配置不起作用

如何解决Java Spring Security:多个HTTP配置不起作用?

看一下Spring Security Reference:

@EnableWebSecurity
public class MultiHttpSecurityConfig {
  @Autowired
  public void configureGlobal(AuthenticationManagerBuilder auth) { 1
      auth
          .inMemoryAuthentication()
              .withUser("user").password("password").roles("USER").and()
              .withUser("admin").password("password").roles("USER", "ADMIN");
  }

  @Configuration
  @Order(1)                                                        2
  public static class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {
      protected void configure(HttpSecurity http) throws Exception {
          http
              .antMatcher("/api/**")                               3
              .authorizeRequests()
                  .anyRequest().hasRole("ADMIN")
                  .and()
              .httpBasic();
      }
  }    

  @Configuration                                                   4
  public static class formLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

      @Override
      protected void configure(HttpSecurity http) throws Exception {
          http
              .authorizeRequests()
                  .anyRequest().authenticated()
                  .and()
              .formLogin();
      }
  }
}

1正常配置身份验证

2创建一个WebSecurityConfigurerAdapter包含的实例,@Order以指定WebSecurityConfigurerAdapter应首先考虑的对象。

3 http.antMatcher指出这HttpSecurity仅适用于以开头的URL/api/

4创建的另一个实例WebSecurityConfigurerAdapter。如果URL不以/api/该配置开头,则将使用此配置。此配置被认为是之后的,ApiWebSecurityConfigurationAdapter因为它的@Order值是after 1(没有@Order默认值是last)。

您的第二个配置未使用,因为您的第一个配置匹配/**(未antMatcher配置)。而且您的第一个配置仅限制/admin/**,默认情况下允许所有其他URL。

解决方法

我正在尝试使用Spring Security,并且有一个用例,其中我想保护不同的登录页面和不同的URL集。

这是我的配置:

@Configuration
@Order(1)
public static class ProviderSecurity extends WebSecurityConfigurerAdapter{
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/","/home").permitAll()
                .antMatchers("/admin/login").permitAll()
                .antMatchers("/admin/**").access("hasRole(''BASE_USER'')")
                .and()
            .formLogin()
                .loginPage("/admin/login").permitAll()
                .defaultSuccessUrl("/admin/home")
                .failureUrl("/admin/login?error=true").permitAll()
                .usernameParameter("username")
                .passwordParameter("password")
                .and()
            .csrf()                    
                .and()
            .exceptionHandling().accessDeniedPage("/Access_Denied");            
    }
}


@Configuration
@Order(2)
public static class ConsumerSecurity extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/consumer/login").permitAll()
                .antMatchers("/consumer/**").access("hasRole(''BASE_USER'')")
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/consumer/login").permitAll()
                .defaultSuccessUrl("/consumer/home")
                .failureUrl("/consumer/login?error=true").permitAll()
                .usernameParameter("username")
                .passwordParameter("password")
                .and().csrf()                
                .and()
            .exceptionHandling().accessDeniedPage("/Access_Denied");
    }
}

这些类是MultipleHttpSecurityConfig具有注释的另一个类的内部类@EnableWebSecurity

的安全性admin/**工作正常,但所有consumer/**页面均未得到保护,登录页面未发生任何重定向。我搜索了其他答案,但没有一个有效。

PreAuthorize在Spring Security中不起作用

PreAuthorize在Spring Security中不起作用

如何解决PreAuthorize在Spring Security中不起作用?

为什么@PreAuthorize不起作用?它不会引发任何异常或错误。我已经为这项任务苦苦挣扎了好几天。我已经尝试了很多选项,但是没有用。

我将非常感谢任何能帮助解决此问题的人problem。

SecurityConfig.java

    package com.testpreauthorize.security;

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
    import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    import org.springframework.security.core.userdetails.UserDetailsService;

    @Configuration
    @EnableWebSecurity
    @EnableGlobalMethodSecurity(prePostEnabled = true)
    public class SecurityConfig extends WebSecurityConfigurerAdapter {

        @Autowired
        UserDetailsService userDetailsService;

        @Autowired
        protected void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
            auth.userDetailsService(userDetailsService);
        }





        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                    .authorizeRequests()
                    .anyRequest()
                    .permitAll()


                    .and()
                    .formLogin()
                    .loginPage("/login")
                    .loginProcessingUrl("/login")

                    .defaultSuccessUrl("/")

                    .and()

                    .logout()
                    .permitAll()
                    .logoutUrl("/logout")
                    .logoutSuccessUrl("/")

                    .invalidateHttpSession(true)
                    .deleteCookies("JSESSIONID")
                    .and()
                    .csrf().disable();

        }


    }

HomeController.java

    package com.testpreauthorize.controller;

    import org.springframework.security.access.prepost.PreAuthorize;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PostMapping;

    @Controller
    public class HomeController {

        @GetMapping(value = "/")
        public String home () {
            return "/home";
        }


        @PreAuthorize("isAuthenticated()")
        @GetMapping(value = "/user")
        public String user () {
            return "/user";

        }


        @GetMapping(value = "/login")
        public String loginGet () {
            return "/login";
        }

        @PostMapping(value = "/login")
        public String loginPost () {
            return "redirect:/user";
        }


    }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

Spring safety:拦截URL模式access =“#id == 1

Spring safety:拦截URL模式access =“#id == 1

我有项目是IAM Spring Security 3.1.3和MVC 3.2

我也想允许路径中的userid中的URL与主体userid匹配

    <security:intercept-url pattern="/user/{id}/edit" access="#id == principal.userId"/>

http use-expressions将其设置为true,并且当尝试principal.userId ==
1时,它可以工作,但是我需要使用从URL中提取的值。

我已经尝试了所有可能的组合。

答案1

小编典典

这是不可能的。但是还有另一种方式。您可以定义自己的网络表达式,该表达式将负责从URL中提取id参数。可能看起来像这样:

<security:intercept-url pattern="/user/{id}/edit" access="getIdUrlPathParameter() == principal.userId"/>

为此,您需要:
1.添加扩展 WebSecurityExpressionRoot的 CustomWebSecurityExpressionRoot
2.添加getIdUrlPathParameter()方法。它将有权访问HttpServletRequest对象。
3.定义CustomWebSecurityExpressionHandler,以扩展
DefaultWebSecurityExpressionHandler
。覆盖createSecurityExpressionRoot方法,然后在此处使用CustomWebSecurityExpressionRoot。
4.定义自定义访问决策管理器(下面的xml)
5. 通过access-decision-manager-ref属性将其注入到 http 元素中

<security:http access-decision-manager-ref="customAccessDecisionManagerBean" >    <security:intercept-url pattern="/user/{id}/edit" access="getIdUrlPathParameter() == principal.userId"/></security:http><bean id="customWebSecurityExpressionHandler"/><bean id="customAccessDecisionManagerBean">    <property name="decisionVoters">        <list>            <bean>                <property name="expressionHandler" ref="customWebSecurityExpressionHandler" />            </bean>        </list>    </property></bean>

关于Spring Security拦截URL模式不起作用spring security 拦截的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于@PreAuthorize批注在Spring Security中不起作用、Java Spring Security:多个HTTP配置不起作用、PreAuthorize在Spring Security中不起作用、Spring safety:拦截URL模式access =“#id == 1等相关内容,可以在本站寻找。

本文标签: