java - Spring Security 如何在 Servlet 上工作

标签 java spring servlets spring-security

我有一个调用 Servlet 的 java:

public class UserServlet extends HttpServlet {

    @Autowired
    private UserService userService;

    @Override
    protected void service(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
        userService.checkUser();
        userService.doSomethingRestricted();
    }

    @Override
    public void init(final ServletConfig config) throws ServletException {
            SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
            SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, config.getServletContext());
            super.init(config);
    }

}

还有我的自动连接服务:

@Component(value = "userService")
public class UserService {

    public boolean checkUser() {
        if (SecurityContextHolder.getContext().getAuthentication() != null) {
            Authentication auth = SecurityContextHolder.getContext().getAuthentication();
                if (auth != null && auth.getPrincipal() != null && auth.getPrincipal() instanceof User) {
                    User springUser = (User) auth.getPrincipal();
                    if (springUser != null) {
                        LOG.debug("USER CONNECTED :: {}", springUser.getUsername());
                    }
                }
        } else {
            LOG.debug("NO CONNECTED USER, CREATING ONE");
            Collection<GrantedAuthority> authorities = getGrantedAuthorities();
            org.springframework.security.core.userdetails.User springUser = new org.springframework.security.core.userdetails.User("user","password", true, true, true, true, authorities);
            Authentication auth = new UsernamePasswordAuthenticationToken(springUser, "", authorities);
            SecurityContext sc = new SecurityContextImpl();
            sc.setAuthentication(auth);
            SecurityContextHolder.setContext(sc);
        }
        return true;
    }   


    @Secured({ "CONNECTED" })
    public void doSomethingRestricted() {
        LOG.debug("SOMETHING RESTRICTED HAS BEEN DONE!!");
    }

}
  • 当我第一次测试我的应用程序时,Java 客户端向服务器发送一个 POST ,服务器将检查用户并且找不到上下文:一个新的上下文将是创建。

  • 当我随后运行 java 客户端时,我发现一个现有的 Context(在第一次调用中创建的)。

显然缺少一些东西,因为如果第一个用户成功登录,并不意味着任何用户都可以连接。

我错过了什么?起初我考虑为每个Java客户端实例使用 session (我没有Web浏览器客户端,所以我需要手动设置 session ID),但是Spring什么时候应该在http请求中获取或设置 session ID?

TL;DR: SecurityContextHolder.getContext().getAuthentication() 在我的示例中做了什么?

最佳答案

它获取当前登录用户的身份验证详细信息,您是否已添加

<bean id="httpSessionFilter" class="org.springframework.security.web.context.SecurityContextPersistenceFilter"/>

为了引入 Web 应用程序的登录,Spring Security 也被设计为与 POJO 一起使用,如果您使用旧方法,则需要在映射中添加此过滤器。如果您在 applicationContext 中使用 http 标签,那么它应该按原样工作。

</security:filter-chain-map> 

自从我在 applicatin Context 中没有使用新的 http 标签而使用 spring security 以来已经很长时间了。 spring security context 带有不同的过滤器,SecurityContextPersistenceFilter 决定了上下文如何持久化。

“org.springframework.security.web.context.SecurityContextPersistenceFilter”用于持久保存每个 session 的安全上下文。

Spring security 源自与 acegi security 的集成,acegi security 曾经具有“net.sf.acegisecurity.xml”。 ui.webapp.HttpSessionIntegrationFilter”同一任务的过滤器

关于java - Spring Security 如何在 Servlet 上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15148898/

相关文章:

java - 将私有(private)类声明为别名是否可以接受?

java - 获取android手机的设备配置

java - 如何在spring中显示具有帐户状态的用户列表

java - Spring boot应用程序-Tomcat部署-无法确定合适的驱动程序类

java - 在 servlet 中使用池从池获取与数据库的连接时出错

java - 如何在 Spring 中向 couchbase 文档添加可配置的到期时间?

java - 为什么我在访问字符串时得到 "error : expected ;"?

java - Spring 启动: No matching bean found exception

jsp - 如何将重定向发送到 Servlet 中的 JSP 页面

tomcat - 如何在不重新启动tomcat6服务器的情况下重新加载servlet