本篇文章给大家谈谈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 拦截)
- @PreAuthorize批注在Spring Security中不起作用
- Java Spring Security:多个HTTP配置不起作用
- PreAuthorize在Spring Security中不起作用
- Spring safety:拦截URL模式access =“#id == 1
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’登录并点击URLhttp://localhost:8080/siteadmin/homepage/
,则允许用户’a’查看页面,尽管他的角色不是admin
。但是,当我尝试击中时,http://localhost:8080/siteadmin
Spring
Security可以正常工作。其显示拒绝访问页面。我想限制/admin/*
没有Admin
角色的用户的URL 。
答案1
小编典典参见AntPathMatcher:
映射使用以下规则匹配URL:
?
匹配一个字符*
匹配零个或多个字符**
匹配路径中的零个或多个目录一些例子:
com/t?st.jsp
-比赛com/test.jsp
,com/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.jsp
也org/springframework/testing/servlet/bla.jsp
和org/servlet/bla.jsp
您的图案/siteadmin***
缺少斜线。使用/siteadmin/**
。
@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配置不起作用?
看一下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
不起作用?它不会引发任何异常或错误。我已经为这项任务苦苦挣扎了好几天。我已经尝试了很多选项,但是没有用。
我将非常感谢任何能帮助解决此问题的人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
我有项目是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等相关内容,可以在本站寻找。
本文标签: