【问题标题】:Implement spring security on google app engine在谷歌应用引擎上实现 Spring Security
【发布时间】:2015-05-06 07:37:48
【问题描述】:

我正在尝试将 spring 安全性集成到谷歌应用引擎上。但它不能正常工作。我希望在用户尝试访问index 页面时对其进行身份验证,并将他们重定向到login 页面。但是现在我可以直接访问index页面了。

我关注了spring.io网站教程和mkyong教程。

这是我的 pom.xml 依赖项的一部分

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.1.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.webflow</groupId>
            <artifactId>spring-webflow</artifactId>
            <version>2.4.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
            <version>3.2.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
            <version>3.2.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

AppConfig

@EnableWebMvc
@Configuration
//@ComponentScan({ "com.example.web.*" })
@ComponentScan({ "com.example.web" })
@Import({ SecurityConfig.class })
public class AppConfig {
    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix("/WEB-INF/jsp/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }
}

SecurityConfig

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth)
            throws Exception {
        auth.inMemoryAuthentication().withUser("user").password("password")
                .roles("USER");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().authenticated().and().formLogin()
                .loginPage("/account/login");
    }
}

SecurityWebApplicationInitializer

public class SecurityWebApplicationInitializer extends
        AbstractSecurityWebApplicationInitializer {
}

WebApplicationInitializer

public class WebApplicationInitializer extends
        AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] { AppConfig.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return null;
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
}

AccountController

@Controller
@RequestMapping("/account")
public class AccountController {

    @RequestMapping(value = "/login", method = RequestMethod.GET)
    public String Index(Model model) {

        return "login";
    }
}

HomeController

@控制器 @RequestMapping("/") 公共类 HomeController {

@RequestMapping(method = RequestMethod.GET)
public String Index(Model model) {

    model.addAttribute("x", 1);
    model.addAttribute("y", 2);
    model.addAttribute("z", 3);

    return "index";
}

index.jsp页面

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@page session="true"%>
<!DOCTYPE html>
.....

login.jsp页面

<%@page session="false"%>
<!DOCTYPE html>

我现在想要实现的是将未经身份验证的用户重定向到登录页面。 但是现在不行了,我可以直接访问主页。

【问题讨论】:

    标签: spring google-app-engine spring-security


    【解决方案1】:

    WebApplicationInitializer 需要 Servlet 3.0,但 Appengine 仅支持 Servlet 2.5。所以你必须使用基于 XML 的配置,至少在初始化时。并手动配置web.xml中的Spring过滤器/servlet。

    你需要输入web.xml:

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring-security.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    
    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    <servlet>
        <servlet-name>spring-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
        <init-param>
            <param-name>contextClass</param-name>
            <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
        </init-param>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>path.to.AppConfig</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>spring-dispatcher</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
    

    进入spring-security.xml

    <context:annotation-config/>
    <beans:bean class="path.to.SecurityConfig"/>
    

    基本上它都是 pre-servlet 3.0 时代的标准内容,您可以使用任何基于 servlet 2.4 或 2.5 的教程(或旧文档),它适用于 Appengine。

    PS 你也可以在https://code.google.com/p/googleappengine/issues/detail?id=3091投票支持 Servlet 3.0

    【讨论】:

    • 非常感谢,我现在就试试。但是gae真的让我很头疼。你经常使用 gae 吗?在什么用例中?
    • 经常使用它,是的。很棒的平台。但有一些进入壁垒,与传统托管相比有很多不同之处,需要学习的东西很多等等。
    • 你觉得它与 aws 相比如何?
    • 不同的东西。您可以将 Google Compute Engine 或 Container Engine 与 AWS 进行比较。我认为它拥有卓越的技术和对开发人员更友好,并且更容易制作可扩展的应用程序(一切都只关注它)
    • 我可以邀请你看这个问题吗,stackoverflow.com/questions/28891610
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 2012-05-01
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多