在 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 注解

spring-boot实战09:Spring Boot中使用@Scheduled创建定时任务

在 spring-boot 中使用一个模板引擎渲染多个后缀