当前位置: 首页 > 知识库问答 >
问题:

Spring3.2:根据用户角色选择视图

支智志
2023-03-14

使用spring webmvc和spring security web 3.2版,我希望根据用户角色(或用户是否经过身份验证)返回不同的视图,以便对于“/”请求,角色匿名用户(或未经身份验证的用户)获得欢迎页面,角色用户用户获得主页。

我目前的做法是使用常规控制器:

@Controller
public class WelcomeCtrl {

    @RequestMapping("/")
    public String welcome(Principal principal) {
        if (userAuthenticated(principal)) {
            return "redirect:home";
        }
        return "welcome";
    }

    private boolean userAuthenticated(Principal principal) {
        return principal != null && principal instanceof Authentication
                && hasUserRole((Authentication) principal);
    }

    private boolean hasUserRole(Authentication principal) {
        Collection<? extends GrantedAuthority> authorities = (principal)
                .getAuthorities();
        return Iterables.contains(Collections2.transform(authorities,
                new Function<GrantedAuthority, String>() {

                    @Override
                    public String apply(GrantedAuthority authority) {
                        return authority.getAuthority();
                    }
                }), "ROLE_USER");
    }

}

然而,我并不喜欢它,因为我觉得这个重定向应该用SpringSecurity来完成(我错了吗?)。您知道使用Spring Security配置实现这一点的方法吗?我当前的配置如下:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/welcome").permitAll()
                .anyRequest().authenticated()
            .and().formLogin()
                .defaultSuccessUrl("/home").permitAll()
                .and().logout().permitAll();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder authManagerBuilder)
            throws Exception {
        authManagerBuilder.inMemoryAuthentication().withUser("user")
                .password("password").roles("USER");
    }
}

共有1个答案

邹野
2023-03-14

据我所知,这是使用市场上最新的spring security配置的最佳方式。

在Spring 3.1中,对Java配置的一般支持被添加到Spring框架中。自Spring Security 3.2以来,一直有Spring SecurityJava配置支持,使用户无需使用任何XML即可轻松配置Spring Security。

如果您熟悉安全命名空间配置,那么您应该会发现它与安全Java配置支持之间有很多相似之处,您可以使用安全命名空间配置以及适合您的配置

Spring安全3.2增加了许多新的东西,你可以像这样使用

1)。Java配置--对于那些更熟悉阅读jar文件以应用配置方法的人来说更好。

2). 并发支持——在大多数环境中,安全性存储在每个线程的基础上。这意味着在新线程上完成工作时,SecurityContext将丢失。springsecurity提供了一些基础设施,帮助用户更轻松地实现这一点。SpringSecurity为在多线程环境中使用SpringSecurity提供了低级抽象。事实上,这就是Spring Security性与AsyncContext集成的基础。启动(可运行)和Spring MVC异步集成。

3). CSRF攻击:-假设您的银行网站提供了一个表单,允许将资金从当前登录的用户转移到另一个银行帐户。例如,HTTP请求可能如下所示:

POST /transfer HTTP/1.1
Host: bank.example.com
Cookie: JSESSIONID=randomid; Domain=bank.abc.com; Secure; HttpOnly
Content-Type: application/x-www-form-urlencoded

amount=100.00&routingNumber=1234&account=9876

现在假装你在银行网站上进行了身份验证,然后在没有注销的情况下,访问了一个邪恶的网站。邪恶网站包含以下形式的超文本标记语言页面:

<form action="https://bank.example.com/transfer" method="post">
  <input type="hidden"
      name="amount"
      value="100.00"/>
  <input type="hidden"
      name="account"
      value="evilsAccountNumber"/>
  <input type="submit"
      value="ohh you Win Money!"/>
</form>

你喜欢赢钱,所以点击提交按钮。在此过程中,您无意中将100美元转移给恶意用户。这是因为,尽管邪恶网站无法看到您的cookie,但与您的银行相关联的cookie仍会随请求一起发送。

这种类型的攻击可以通过使用Spring安全3.2轻松阻止,因为Spring安全中的跨站点请求伪造(CSRF)保护新功能会生成一些令牌,这些令牌在支付网关端匹配。

还有更多的优势。。。。。。。。。。。。。。。。。。。。。。

 类似资料:
  • 登录帧 菜单框架

  • 问题内容: 我有一种情况,我想在Jenkins参数化的版本中更改选择参数的内容。 就我而言,我想要一个用于部署应用程序“ Deploy My App”的项目。在构建该项目时,将为用户提供一个选择参数。我想根据用户角色更改此列表的内容。例如,具有“ dev_deploy”角色的人将能够看到开发环境,而具有“ test_deploy”角色的人将能够看到测试环境等。 我当前正在使用可扩展选择参数插件和基

  • 一个Java springboot程序,需要用户根据角色登录,用户角色有管理员、学生、教师三种 目前数据库表有如下两种构建方式: 直接整一个用户表然后加一个权限字段 除用户表外,对于角色分成老师学生管理员三个表,将其与用户表进行关联 从程序的健壮性及后期维护成本来说,请问哪种方案好一点

  • 我目前正在构建一个SPA类型的应用程序原型。第一步是用Laravel Passport实现一个API并保护它。为此,我从这个现有的结构中获得灵感: Laravel SPA。问题是,没有一个API URL是受保护的,这意味着,作为用户,我可以从API请求所有信息。 所以我决定从零开始,更加安全。我使用的是一个角色和权限包:Laravel permission。 这是我第一次实现和API,我一直坚持使

  • 这是我的不和谐机器人我正在工作最近,在我把所有的代码移到我的VPS后,reactionroles不再工作了。 因此,由于某种原因,每次单击emoij时,它不会向用户添加角色,我试了很多次,但没有成功。看来应该能行,我是不是漏掉了什么?当我启动机器人时,一切似乎都很好,甚至命令也起作用了。我没有在role.id中犯任何错误,因为我也尝试了role.name,并在其中输入了名称。这也没用,我希望你有足

  • 我想让程序根据我的扫描仪输入从ArrayList中进行选择。比如,我写早餐和甜食,它必须随机列出早餐甜食,并打印随机索引。 我还在学习Java,我只是在玩,并试图编码小项目来训练它。 下面是我已经写过的课程: 我是否可以将列表存储在变量中,可能是这样的: 我知道很难理解我,但英语不是我的主要语言,希望它能被理解。