【问题标题】:Using Spring Security extras with Spring Boot in JavaFX application在 JavaFX 应用程序中使用 Spring Security extras 和 Spring Boot
【发布时间】:2020-03-17 23:41:09
【问题描述】:

我正在使用堆栈 Spring Boot + Spring Security + JavaFX 编写一个小型应用程序。 对于将 JavaFX 与 Spring Boot 和 Spring Security 集成,我使用了来自 Github 的这个源: https://github.com/emorgado/javafx-springboot-springsecurity

如何在 FXML 文件中使用 Spring Security 附加功能(例如 Thymeleaf 的附加功能)? 例如: 百里香 -

<li class="nav-item" sec:authorize="hasRole('ROLE_ADMIN')">
  <a class="nav-link" th:href="@{/settings}">
     <p>Settings</p>
  </a>
</li>

FXML -

<Menu mnemonicParsing="false" text="Settings">
    <MenuItem mnemonicParsing="false" onAction="#mainSettingsAction" text="Main settings" />
</Menu>

有没有办法在 FXML 文件中使用 sec:authorize 或标签 &lt;security&gt; 等属性?

【问题讨论】:

    标签: java spring spring-boot javafx


    【解决方案1】:

    我认为您应该制作自己的 fxml 编译器,例如 e(fx)clipse FXML 编译器。

    但是, 你可以使用这个技巧。

    在.fxml中

    <MenuItem fx:id="menuSettings" mnemonicParsing="false" onAction="#mainSettingsAction" text="Main settings" userData="ROLE_ADMIN"/>
    

    在控制器中。

    @FXML private MenuItem menuSettings;
    
    if(menuSettings != null && menuSettings.getUserData() != null) {
        if("ROLE_ADMIN".equals(menuSettings.getUserData().toString())) {
            menuSettings.getParentMenu().getItems().remove(menuSettings);
        }
    }
    

    【讨论】:

    • 感谢您的回答!我尝试了您建议的操作,但无法正常工作。我使用记录器获取当前用户角色 - log.info(settingsMenu.getUserData());当我使用管理员权限或仅用户权限进行授权时,它会返回 ROLE_ADMIN。所以你的代码删除了两个用户的 menuSettings(对于管理员和用户)
    • 可能我需要从自动装配的 AuthenticationManager 获取当前用户角色。然后检查当前用户 roleList 是否包含 ROLE_ADMIN ?
    【解决方案2】:

    非常感谢 Charles Lee 的帮助! 我为这个问题提供了我的解决方案:

    @FXML private MenuItem settingsMenu;
        @FXML
        public void initialize(URL location, ResourceBundle resources) {
    
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        Doctor currentUser = (Doctor) doctorService.findDoctorByDoctorUsername(authentication.getName());
    
        if(!currentUser.getRoles().contains(Role.ADMIN)) {
        settingsMenu.getParentMenu().getItems().remove(settingsMenu);
        }
    
        }
    

    【讨论】:

    • 当然。我只是给了个提示。当然,“ROLE_ADMIN”不应该是硬编码的。
    猜你喜欢
    • 2016-07-16
    • 2017-03-06
    • 2019-05-08
    • 1970-01-01
    • 2020-03-20
    • 2015-08-17
    • 2018-01-15
    • 2016-08-26
    相关资源
    最近更新 更多