在 Spring Boot 中使用 Useroles 访问 JSP 页面的权限
Posted
技术标签:
【中文标题】在 Spring Boot 中使用 Useroles 访问 JSP 页面的权限【英文标题】:Permission to Access JSP Page Using Useroles in Spring Boot 【发布时间】:2018-01-09 15:15:13 【问题描述】:我想根据我的spring boot app中的UserRole来限制一些JSP页面
为此,我已经看到了很多这样的例子:-
http.authorizeRequests().antMatchers("/login").permitAll()
.antMatchers("/admin/**").hasRole("ADMIN")
但我的问题是我无法像 ADMIN 或 USER 那样对 UserRoles 进行硬编码,因为我在不同场合创建了新的用户角色,所以我无法对确切的用户角色进行硬编码。我有关于可以访问我的数据库中的 jsp 页面列表的用户角色,这里 iam 使用 spring security 和 iam newbie to spring boot 和 spring security。
编辑
我的配置类是
@Configuration
@EnableWebSecurity
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter
@Autowired
private UserDetailsService userDetailsService;
@Autowired
CustomAuthHandler customAuthenticationHandler;
@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder()
System.out.println(1);
return new BCryptPasswordEncoder();
@Bean
CustomAuthHandler authenticationHandler()
return new CustomAuthHandler();
/*@Override
public void configure(WebSecurity web) throws Exception
web.ignoring()
.antMatchers("/edu/assets/**");
*/
@Override
protected void configure(HttpSecurity http) throws Exception
http
.authorizeRequests()
.antMatchers("/edu/**","/Login**","/UserSignUP","/organization**","/email_availablity").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/Login").usernameParameter("username").passwordParameter("password")
.defaultSuccessUrl("/index1",true).failureHandler(customAuthenticationHandler).permitAll()
.and()
.logout()
.permitAll()
.and()
.csrf().disable();
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception
auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder());
【问题讨论】:
您可以在 application.properties 文件中定义角色并将它们注入您的类。 @Juvanis 可以创建新的用户角色,所以我无法预测未来的角色 @arsulhuk,您上面的代码 sn-p 包含在一个用@Bean
注释的函数中。因此,当您启动服务时,它会被初始化。
@sunkuet02 对不起朋友,我不明白 t.plzz 用一个例子解释
你需要这样做***.com/questions/31704593/…,从数据库中获取角色和模式
【参考方案1】:
终于找到答案了……
1.在你的spring boot中创建一个拦截器类
public class MyCustomInterceptor implements HandlerInterceptor
//unimplemented methods comes here. Define the following method so that it
//will handle the request before it is passed to the controller.
@Override
public boolean preHandle(HttpServletRequest request,HttpServletResponse response)
//your custom logic here.(for request validating)
return true;
2.定义一个配置类
@Configuration
public class MyConfig extends WebMvcConfigurerAdapter
@Override
public void addInterceptors(InterceptorRegistry registry)
registry.addInterceptor(new MyCustomInterceptor()).addPathPatterns("/**");
现在您的请求将通过 MyCustomInterceptor 的 preHandle() 方法下定义的逻辑,然后再通过控制器
【讨论】:
【参考方案2】:首先,您正在验证 api 而不是 .jsp
页面。
@Configuration 注解在 java 文件中用于配置您的应用程序,而不是 xml 配置。来自spring
的官方文档:
表示一个类声明了一个或多个@Bean 方法并且可能是 由 Spring 容器处理以生成 bean 定义和 运行时对这些 bean 的服务请求。
因此,当您使用 @Configuration
注释类时,方法只会在您启动程序的最开始时执行一段时间。这就是为什么你不能从下面的方法动态检查UserRoles
:
@Override
protected void configure(HttpSecurity http) throws Exception
// inner codes
因此,如果您想通过该方法进行授权,您必须硬编码(在您的 .java
文件或 .properties
文件中)。
解决方案
我注意到您使用UserDetailsService
进行登录。您可以修改loadUserByUsername(String username)
方法并动态检查用户的授权。
步骤:
在数据库中存储完整的用户信息:登录名、密码和角色。为此,您需要 3 个表:1.User
、2.Roles
和 3.User_Roles
。每次登录时,您需要将UserRoles
(从数据库中读取角色)设置为UserInfo
对象。
然后你可以在你的项目中添加一个Interceptor(作为一个url过滤器)来检查每个api(或url)是否被记录的用户被授权使用api。为此,您可以使用角色的用户名查询数据库并与请求的 uri 进行比较。
【讨论】:
感谢您的回复,但我也使用了 loadUserByUsername(String username) 方法。请检查此链接***.com/questions/31704593/… 我认为您的网址是针对特定角色而非用户进行硬编码的。而且,我已经给出了这种情况的解决方案。在解决方案的第二步中,您可以动态验证具有特定角色的用户的 url @arsulhuk,我见过这个。但我的解决方案比这更好,我认为大多数人都会建议我的解决方案。并且最好在db中存储用户角色而不是url路径。 @arsulhuk,我们是一个社区,所以没什么好打扰的。 k 朋友,你能给我举个例子吗?以上是关于在 Spring Boot 中使用 Useroles 访问 JSP 页面的权限的主要内容,如果未能解决你的问题,请参考以下文章
在 spring-boot 项目中使用 spring mvc xml 项目
Spring boot在Spring boot中Redis的使用
如何在 spring-boot 中禁用 spring-data-mongodb 自动配置
如何在 Spring Boot 中使用 @Transactional 注解