是否可以将Spring Security 4(主要用于管理用户访问级别以及他们可以访问的视图)与JSF 2集成在一起?
我发现这很简单,可以让您将Spring Boot和JSF 2与PrimeFaces 5混合使用。我想看看您是否可以将其提升到另一个水平。
通常,您将像这样为Spring MVC配置Spring Security:
WebSecurityConfig.java
@Configuration @EnableWebMvcSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/", "/home").permitAll() .anyRequest().authenticated() .and() .formLogin() .loginPage("/login") .permitAll() .and() .logout() .permitAll(); } @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth .inMemoryAuthentication() .withUser("Zyst").password("password").roles("USER"); } }
然后,据我所知,如果我弄错了,请纠正我,查看您的MvcConfig,以了解“ / home”等实际上的含义:
MvcConfig.java
@Configuration public class MvcConfig extends WebMvcConfigurerAdapter { @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/home").setViewName("home"); registry.addViewController("/").setViewName("home"); registry.addViewController("/hello").setViewName("hello"); registry.addViewController("/login").setViewName("login"); } }
但是,我已经搜索了几个小时,无法真正找到如何为JSF配置Spring Security的最终答案。您是否可以使用JSF来实现您的前端,然后由Spring Security对其进行管理,例如,可以正确地管理和提供Links,例如:localhost:8080 / home而不是localhost:8080 / home.xhtml?因此,中定义的用户级别WebSecurityConfig.java只能访问与其自己相关的页面。
根据我(简短地)进行的调查,由于Faces和Mvc是不同的技术,无法很好地协同工作,因此不可能实现。但是,如果可能的话,我想确定是否可行。
并且,如果可以的话,您能否提供一个可行的示例,或者提供指向更深入的地方的链接?我做了很多谷歌,但有100%的可能性我最终错过了一些东西。
任何和所有答案都将不胜感激。
*一起使用Spring Boot,Spring Security,JSF和Spring Core *没问题 ,最后,JSF视图被解析为url,这就是您在Spring Security中使用的方式。这是我自己的应用程序中的配置示例,为节省代码量,我进行了一些修剪。该代码是不言自明的:
@Configuration @EnableWebMvcSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { // Have to disable it for POST methods: // http://stackoverflow.com/a/20608149/1199132 http.csrf().disable(); // Logout and redirection: // http://stackoverflow.com/a/24987207/1199132 http.logout() .logoutRequestMatcher(new AntPathRequestMatcher("/logout")) .invalidateHttpSession(true) .logoutSuccessUrl( "/login.xhtml"); http.authorizeRequests() // Some filters enabling url regex: // http://stackoverflow.com/a/8911284/1199132 .regexMatchers( "\\A/page1.xhtml\\?param1=true\\Z", "\\A/page2.xhtml.*") .permitAll() //Permit access for all to error and denied views .antMatchers("/500.xhtml", "/denied.xhtml") .permitAll() // Only access with admin role .antMatchers("/config/**") .hasRole("ADMIN") //Permit access only for some roles .antMatchers("/page3.xhtml") .hasAnyRole("ADMIN", "MANAGEMENT") //If user doesn't have permission, forward him to login page .and() .formLogin() .loginPage("/login.xhtml") .loginProcessingUrl("/login") .defaultSuccessUrl("/main.xhtml") .and().exceptionHandling().accessDeniedPage("/denied.xhtml"); } @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { //Configure roles and passwords as in-memory authentication auth.inMemoryAuthentication() .withUser("administrator") .password("pass") .roles("ADMIN"); auth.inMemoryAuthentication() .withUser("manager") .password("pass") .roles("MANAGEMENT"); } }
当然,此代码适用于带*.xhtml后缀的url,因为它们由JSF Servlet提供。如果要避免使用此后缀,则应使用url重写工具作为Prettyfaces。但这是StackOverflow中已经广泛讨论的另一个故事。
*.xhtml
另外,请记住将 登录表单定位为配置的登录处理URL, 以让Spring Security处理身份验证并重定向到您的主页。我通常要做的是使用非JSF表单,并在其上应用Primefaces样式:
<form id="login_form" action="#{request.contextPath}/login" method="post"> <p> <label for="j_username" class="login-form-tag">User</label> <input type="text" id="username" name="username" class="ui-corner-all" required="required" /> </p> <p> <label for="j_password" class="login-form-tag">Password</label> <input type="password" id="password" name="password" class="ui-corner-all" required="required" /> </p> <p> <button type="submit" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"> <span class="ui-button-text">Login</span> </button> </p> </form>
也可以看看: