Spring Security 4 和 JSF 2 集成
Posted
技术标签:
【中文标题】Spring Security 4 和 JSF 2 集成【英文标题】:Spring Security 4 and JSF 2 integration 【发布时间】:2015-06-29 14:49:29 【问题描述】:有没有办法集成 Spring Security 4(主要用于管理用户访问级别以及他们可以访问哪些视图)和 JSF 2?
我找到了this neat thing,它允许您将 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 管理,因此,例如链接,即:localhost:8080/home 而不是 localhost:8080/home.xhtml 得到适当的管理和服务?这样WebSecurityConfig.java
中定义的用户级别只能访问与自己相关的页面。
根据我(简要地)调查过的情况,这可能是不可能的,因为 Faces 和 Mvc 是不同的技术,不能很好地协同工作。但是,如果可能的话,我想确定它是否可能。
如果可能的话,您能否提供一个可行的示例,或者提供一个更深入的地方的链接?我用谷歌搜索了很多,但 100% 有可能我最终遗漏了一些东西。
非常感谢任何和所有的答案。
【问题讨论】:
"但是,我已经用谷歌搜索了几个小时,并没有真正找到如何为 JSF 配置 Spring Security 的结论性答案"。与您在*** Spring 上单独使用 Spring MVC 时配置 Spring Security 的操作没有什么不同。 JSF 也可以在 Spring 框架之上使用。 Spring Security 也是如此。在这种情况下,Spring MVC 和 PrimeFaces 是不同的故事(是的,您最初出于某些不清楚的原因将它们都标记为 [Spring MVC] 和 [PrimeFaces])。 【参考方案1】:一起使用 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://***.com/a/20608149/1199132
http.csrf().disable();
// Logout and redirection:
// http://***.com/a/24987207/1199132
http.logout()
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
.invalidateHttpSession(true)
.logoutSuccessUrl(
"/login.xhtml");
http.authorizeRequests()
// Some filters enabling url regex:
// http://***.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。但这是另一个已经在 *** 中广泛讨论的故事。
另外,请记住将您的登录表单定位到配置的登录处理 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>
另请参阅:
Spring and JSF integration Spring Boot JSF Integration【讨论】:
我以前使用过 Prettyfaces,我同意:我的问题很混乱,我很抱歉我对 Java Web 堆栈相当缺乏经验,这会导致一些愚蠢的错误。我主要想知道我是否可以使用看起来很新颖的 MVC 方法。在将您标记为正确答案之前,我会让这个问题静置约 24 小时,看看其他人是否有其他方法来解决这个问题。感谢您的回答。 如何将安全标签库与这种方法集成? @Nab 和传统方式一样,但是使用java来声明上下文参数而不是传统的web.xml配置。 @XtremeBiker,是的,它实际上与此一起使用:***.com/questions/7915134/…以上是关于Spring Security 4 和 JSF 2 集成的主要内容,如果未能解决你的问题,请参考以下文章
Spring Security 3.1.4 taglib 授权/身份验证不适用于 Tomcat 7 上 JSF 2.2 中的角色层次结构
JSF 2 + Spring Security 3.1.x @Secured AccessDeniedException 处理
Spring Security + JSF 2.0 + Primefaces + Hibernate 配置
spring security 使用hibernate和jsf认证不同的配置文件和权限