问题:
我们有一个基于Spring MVC的RESTful API,它包含敏感信息.应该保护API,但是不希望向每个请求发送用户的凭证(用户/通过组合).根据REST准则(和内部业务要求),服务器必须保持无状态.API将由mashup风格的方法由另一台服务器使用.
要求:
客户端.../authenticate使用凭据向(未受保护的URL)发出请求; 服务器返回一个安全令牌,其中包含足够的信息,供服务器验证将来的请求并保持无状态.这可能包含与Spring Security的Remember-Me Token相同的信息.
客户端对各种(受保护的)URL进行后续请求,将先前获得的令牌附加为查询参数(或者不太希望的是HTTP请求头).
不能指望客户存储cookie.
由于我们已经使用Spring,因此该解决方案应该使用Spring Security.
我们一直在试图让这项工作碰壁,所以希望那里的人已经解决了这个问题.
鉴于上述情况,您如何解决这一特殊需求?
有概念和实现Spring Security的,如GrantedAuthority界面得到一个权威授权/控制的访问.
我希望这是允许的操作,例如createSubUsers或deleteAccounts,我允许管理员(带角色ROLE_ADMIN).
我在网上看到的教程/演示让我感到困惑.我尝试连接我读到的内容,但我认为我们可以互换地对待这两者.
我看到hasRole消费了一个GrantedAuthority字符串?我肯定在理解上做错了.这些概念在Spring Security中是什么?
如何存储用户的角色,与该角色的权限分开?
我也在查看在org.springframework.security.core.userdetails.UserDetails身份验证提供程序引用的DAO中使用的接口,它使用了一个User(注意最后的GrantedAuthority):
public User(String username,
String password,
boolean enabled,
boolean accountNonExpired,
boolean credentialsNonExpired,
boolean accountNonLocked,
Collection<? extends GrantedAuthority> authorities)
Run Code Online (Sandbox Code Playgroud)
或者还有其他方法可以区分其他两个吗?或者它不受支持,我们必须自己制作?
在我的控制器中,当我需要活动(登录)用户时,我正在执行以下操作来获取我的UserDetails实现:
User activeUser = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
log.debug(activeUser.getSomeCustomField());
Run Code Online (Sandbox Code Playgroud)
它工作正常,但我认为Spring可以在这样的情况下让生活更轻松.有没有办法将UserDetails自动装配到控制器或方法?
例如,类似于:
public ModelAndView someRequestHandler(Principal principal) { ... }
Run Code Online (Sandbox Code Playgroud)
但是,而不是得到UsernamePasswordAuthenticationToken,我得到了一个UserDetails?
我正在寻找一个优雅的解决方案.有任何想法吗?
我在我的Spring MVC应用程序中看到了这个web.xml:
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
Run Code Online (Sandbox Code Playgroud)
我试图找出它为什么存在以及它是否真的需要它.
我在Spring文档中找到了这个解释,但它无助于我理解它:
它似乎表明这个组件是定义的servlet web.xml和Spring中定义的组件之间的"粘合剂" applicationContext.xml.
7.1 DelegatingFilterProxy
当使用servlet过滤器时,你显然需要在你的声明中声明它们
web.xml,否则它们将被servlet容器忽略.在Spring Security中,过滤器类也是在应用程序上下文中定义的Spring bean,因此能够利用Spring丰富的依赖注入工具和生命周期接口.SpringDelegatingFilterProxy提供web.xml了应用程序上下文之间的链接.使用DelegatingFilterProxy时,您将在
web.xml文件中看到类似的内容:Run Code Online (Sandbox Code Playgroud)<filter> <filter-name>myFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>myFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>请注意,过滤器实际上是a
DelegatingFilterProxy,而不是实际实现过滤器逻辑的类.什么DelegatingFilterProxy是将Filter的方法委托给从Spring应用程序上下文获得的bean.这使bean能够受益于Spring Web应用程序上下文生命周期支持和配置灵活性.bean必须实现javax.servlet.Filter,并且必须与filter-name元素中的名称相同.有关更多信息,请阅读DelegatingFilterProxy的Javadoc
所以,如果我把它从我web.xml身上拿走,会发生什么?我的servlet无法与Spring容器通信?**
我一直在使用Spring Security 3.x来处理我的项目的用户身份验证,到目前为止,它已经完美运行.
我最近收到了一个新项目的要求.在此项目中,它需要两组用户身份验证:一组用于根据LDAP对员工进行身份验证,另一组用于根据数据库对客户进行身份验证.我对如何在Spring Security中配置它感到有点困惑.
我最初的想法是创建一个具有以下字段的登录屏幕: -
j_username 用户字段.j_password 密码字段.如果用户选择"employee",那么我希望Spring Security针对LDAP对其进行身份验证,否则将根据数据库对凭据进行身份验证.但是,问题是表单将被提交,/j_spring_security_check并且我无法将单选按钮字段发送到我实现的自定义身份验证提供程序.我最初的想法是,我可能需要两个表单提交URL,而不是依赖于默认值/j_spring_security_check.每个URL都将由不同的身份验证提供程序处理,但我不确定如何在Spring Security中配置它.
我知道在Spring Security中,我可以配置后备身份验证,例如,如果LDAP身份验证失败,那么它将回退到数据库身份验证,但这不是我在这个新项目中拍摄的内容.
有人可以分享我应该如何在Spring Security 3.x中配置它?
谢谢.
更新 - 01-28-2011 - @ EasyAngel的技术
我正在尝试执行以下操作: -
/j_spring_security_check_for_employee/j_spring_security_check_for_customer我想要2种不同的表单登录的原因是允许我根据用户不同地处理身份验证,而不是进行后备身份验证.在我的情况下,员工和客户可能拥有相同的用户ID.
我合并了@ EasyAngel的想法,但必须更换一些已弃用的类.我目前面临的问题是没有过滤进程URLS似乎在Spring Security中注册,因为我不断获取Error 404: SRVE0190E: File not found: /j_spring_security_check_for_employee.我的直觉是springSecurityFilterChainbean没有正确连接,因此根本不使用我的自定义过滤器.
顺便说一下,我正在使用WebSphere,我确实com.ibm.ws.webcontainer.invokefilterscompatibility=true在服务器中设置了属性.我可以/j_spring_security_check毫无问题地达到默认值.
这是我完整的安全配置: -
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:sec="http://www.springframework.org/schema/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd">
<sec:http auto-config="true">
<sec:form-login login-page="/login.jsp" authentication-failure-url="/login.jsp?login_error=1" default-target-url="/welcome.jsp"
always-use-default-target="true" />
<sec:logout …Run Code Online (Sandbox Code Playgroud) java authentication spring forms-authentication spring-security
是否使用@Autowired自动检测?使用@Qualifier时是按名称依赖注入吗?我们如何使用这些注释进行setter和构造函数注入?
我有一个表,我从我的spring控制器方法传递学生对象列表,在页面加载3行被填充.我希望用户能够添加更多行,在按钮单击时删除现有行.任何人都可以告诉我如何实现这一目标.请参阅下面的我的控制器和jsp代码.在单击添加时,我想添加3行,选中复选框,单击删除行应删除该行.我希望添加的列被绑定
我是jQuery的新手,没有jQuery这是可能的.如果没有,请详细告诉我如何使用jQuery实现这一目标

学生实体
@Entity
@Table(name="STUDENT_REGISTRATION")
public class Student {
private int studentId;
private String firstName;
private String lastName;
private Date dob;
private String sex;
private String status;
private Date doj;
private int deptId;
private String deptName;
private int batchId;
private String batchName;
private int roleId;
private String roleName;
private String regNo;
public Student(){
}
public Student(int studentId, String firstName, String lastName, Date dob,
String sex, String status, Date doj, int deptId,
String deptName, int batchId, String batchName, int roleId,
String …Run Code Online (Sandbox Code Playgroud) 我的要求是通过弹出窗口通知用户,说明用户会话即将在x秒内超时,以防用户在网页上执行任何活动.
此要求的另一个要求是在弹出窗口中动态减小值x秒.
我使用的环境是Java EE.
我有一个spring mvc项目设置如下:
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-contexts/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-contexts/configuration-context.xml</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-contexts/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-contexts/configuration-context.xml</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)
如果我在configuration-context.xml中创建一个bean并在servlet-context.xml中引用一个bean,它就无法找到它.这些是作为两个不同的背景创建的吗?为什么这种情况会发生/一般这样?
我已经为我的应用程序设置了 Spring Security Cookie 机制,现在仅用于 API,我需要添加基于 JWT 令牌的身份验证机制。我将 Spring Security 的 MultiHttpSecurityConfiguration 与两个嵌套类一起使用。
会话和 JWT 令牌机制是否应该一起包含在一个应用程序中是一个完全不同的问题,我需要实现两件事。
package com.leadwinner.sms.config;
import java.util.Collections;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.ProviderManager;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
import com.leadwinner.sms.CustomAuthenticationSuccessHandler;
import com.leadwinner.sms.CustomLogoutSuccessHandler;
import com.leadwinner.sms.config.jwt.JwtAuthenticationProvider;
import com.leadwinner.sms.config.jwt.JwtAuthenticationTokenFilter; …Run Code Online (Sandbox Code Playgroud) java ×10
spring ×9
spring-mvc ×7
java-ee ×2
jsp ×2
jquery ×1
jwt ×1
rest ×1
servlets ×1
spring-bean ×1