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

无法获得访问URL与角色ADMINSpring安全

夹谷山
2023-03-14

我的Spring Security性有问题,因为当我登录到这个站点时,我无法通过角色admin访问url。这是我的安全配置

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;

    @Bean
    public PasswordEncoder encoder() {
        return new StandardPasswordEncoder("53cr3t");
    }

    public SecurityConfig(UserDetailsServiceImpl userDetailsService) {
        this.userDetailsService = userDetailsService;
    }




    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
        http.headers().disable();

        http.authorizeRequests()

                .antMatchers("/").authenticated()
                .antMatchers("/rentAppPage/*").hasAuthority("ADMIN")
                .antMatchers("/addVehicle").hasRole("ADMIN")
                .antMatchers("/getVehicle").hasAuthority("ADMIN")
                .antMatchers("/removeVehicle").hasAuthority("ROLE_ADMIN")
                .antMatchers("/updateVehicle").hasAuthority("ROLE_ADMIN")
                .antMatchers("/allUser").hasAuthority("ROLE_ADMIN")
                .antMatchers("/resultGet").hasAuthority("ROLE_ADMIN")
                .antMatchers("/addUser").hasAuthority("ROLE_ADMIN")
                .antMatchers("/getUser").hasAuthority("ROLE_ADMIN")
                .antMatchers("/updateUser").hasAuthority("ROLE_ADMIN")
                .antMatchers("/removeUserById").hasAuthority("ROLE_ADMIN")
                .antMatchers("/price").permitAll()
                .antMatchers("/allScooter").permitAll()
                .antMatchers("/allCar").permitAll()
                .antMatchers("/allMotorBike").permitAll()
                .antMatchers("/allBike").permitAll()
                .antMatchers("/distance").permitAll()
                .antMatchers("/user").permitAll()
                .antMatchers("/rent").permitAll()
                .antMatchers("/rent2").permitAll()
                .antMatchers("/buy").permitAll()
                .antMatchers("/buy2").permitAll()
                .antMatchers("/thanks").permitAll()
                .antMatchers("/rentAppPage").hasAnyAuthority( "ROLE_ADMIN", "ROLE_USER")
                .and()
                .formLogin()
                .loginPage("/login").permitAll()
                .defaultSuccessUrl("/", true);
        ;

        http.sessionManagement()
                //.expiredUrl("/sessionExpired.html")
                .invalidSessionUrl("/login.html");
    }
}

我试图与hasRole, hasAuthure, hasAny权威,但不工作,只有工作许可所有,但我不想访问的东西url用户与角色用户
这是我的登录控制器

@Controller
public class LoginController {
    @Resource(name = "sessionObject")
    SessionObject sessionObject;

    @Autowired
    IAuthenticationService authenticationService;

    public LoginController(){

    }


    @RequestMapping(value = "",method = RequestMethod.GET)
    public String mainSite(){
        return "redirect:login";
    }

@RequestMapping(value = "/login",method = RequestMethod.GET)
    public String showLoginForm(Model model){
        model.addAttribute("userModel",new User());
        model.addAttribute("errorMessage","");
        return "login";
    }

    @RequestMapping(value = "/authenticate",method = RequestMethod.POST)
    public  String authenticateUser(@ModelAttribute("userModel")User user,Model model){
        boolean authResult = this.authenticationService.authenticationUser(user);
        if(authResult){
            System.out.println("logged  !!");
            this.sessionObject.setUser(user);
            return "rentAppPage";
        }else{
            model.addAttribute("errorMessage","error data!!!");
            model.addAttribute("userModel",new User());
            return "login";
        }
    }

    @RequestMapping(value = "/rentAppPage", method = RequestMethod.GET)
    public String page(Model model) {
        if(this.sessionObject.getUser() == null) {
            return "redirect:/login";
        }

        model.addAttribute("username", this.sessionObject.getUser().getUsername());
        System.out.println(this.sessionObject.getUser().getUsername());
        return "rentAppPage";
    }

@RequestMapping(value = "/logout",method = RequestMethod.GET)
    public String logout(){
        this.sessionObject.setUser(null);
        return "redirect:login";
    }

我在数据库中有两个用户,一个是角色管理员,第二个是角色用户,但这不起作用,有人能解释为什么吗?

https://github.com/Conrado1212/Electrical-Rent-App这是我的完整代码

共有2个答案

史劲
2023-03-14

兄弟,如果你能把整个代码发给我们,让我们更好地理解你的错误,那就更好了。但我可以告诉你另一种选择。您只能在HTML中检查角色。例如,您有添加车辆的按钮,您只能根据用户的角色显示和隐藏该按钮。在您的情况下,如果您只想向管理员显示该按钮,则可以如下使用:

    <% if (Page.User.IsInRole("Admin")){ %>
        //your add vehicle button
    <%}%>

免责声明:这不是一个理想的解决方案,但它会起作用。

如果你使用thymeleaf,你可以这样做:-

     <div th:if="${#authorization.expression('hasRole(''ADMIN'')')}">
       <li><a href="/addVehicle">Add Vehicle</a> </li>
     </div>

如果您以管理员身份登录,则只能查看此列表,否则无法查看。如果您想测试它而不是编写列表标记,请使用一些HTML文本,例如

      <div th:if="${#authorization.expression('hasRole(''ADMIN'')')}">
       <label>Hey, Admin only you can see me</label>
     </div>

这里只有角色为admin的用户才能看到此文本。让我知道这是否有效

梁丘远航
2023-03-14

下面的配置肯定是错误的

antMatchers("/rentAppPage/*").hasAuthority("ADMIN")

应该是

antMatchers("/rentAppPage/*").hasRole("ADMIN")

另外,作为一项建议,请尽量保持一致性,您在配置中混合了hasAuthority(“ROLE_ADMIN”)和hasRole(“ADMIN”),当两者的含义相同时,请坚持一个,并使代码更清晰。

 类似资料:
  • 问题内容: 我真的很想用Struts2来解决问题- 通过省略部分路径,我可以访问JSP页面。请注意该路径应该包括在内。关键是要看路径中的单词。 这是文件: 我可以通过: 和通过: 请注意,在两个URL中,我都可以删除,为什么? 来源:http: //www.mkyong.com/misc/how-to-use-mkyong- tutorial/ 有人可以看完上面的教程,告诉我怎么了吗? 问题答案:

  • 在一个扩展WebSecurityConfigureAdapter的类中,我使用以下代码通过url为不同的角色添加安全性。 当我以用户角色登录时,我可以访问:/rest/setup/tax 当我使用管理员角色登录时,我可以访问 /rest/setup/tax http://localhost:8080/rest/setup/tax403(禁止) 我搜索只提供get for user角色和admin

  • 问题内容: 我想为具有以下角色之一(ROLE1或ROLE2)的用户定义某些页面的访问权限 我正在尝试在我的spring security xml文件中进行如下配置: 我尝试了各种方法,例如: 等等 但似乎没有任何效果。 我一直在例外 要么 应该如何配置? 谢谢 问题答案: 问题是我配置了自定义 ,但没有通过其中一名选民。 通过添加到bean中来解决。

  • 我创建了这个简单的控制器: 如您所见,它受的保护。 根据日志: 如您所见,用户已通过身份验证,并具有角色查看器。然而,由于“访问被拒绝”,它无法到达endpoint。 上一个日志片段: 主体:用户名;凭据:[受保护];身份验证:真;详细信息:空;授予权限:查看者 我的JWTFilter看起来像: 有什么想法吗?

  • 我是Spring-Boot的新手。我想创建一个API,它将具有基于角色的访问权限和基于JWT令牌的身份验证。但是,无法实现。 我没有使用JPA 安全配置 控制器 授权过滤器 在这种情况下,除了具有主管角色的用户之外,不应访问api/username。

  • 获取访问攻击是网络渗透测试的第二部分。 在本节中,我们将连接到网络,这将使我们能够发起更强大的攻击并获得更准确的信息。 如果网络不使用加密,我们可以连接到它并嗅出未加密的数据。 如果网络是有线的,我们可以使用电缆并连接到它,可能通过更改我们的MAC地址。唯一的问题是攻击目标使用加密,如WEP,WPA,WPA2。 如果我们确实遇到加密数据,我们需要知道解密它的密钥,这在本章将会学习和实践。 如果网络