我一直在使用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
我使用Google Maps API创建了一张地图,突出了所有明尼苏达州的县.基本上,我使用一组经度/纬度坐标创建了县多边形.这是生成的地图的屏幕截图: -

用户要求之一是能够将类似的地图作为图像,以便它们可以将其嵌入到PowerPoint /主题幻灯片中.我找不到任何有用的Google Maps API,它允许我按原样保存我的自定义地图(如果你知道一种方式,请告诉我),所以我想我应该用Java中的Graphics2D绘制它.
在阅读了将经度/纬度转换为X/Y坐标的公式后,我最终得到以下代码: -
private static final int EARTH_RADIUS = 6371;
private static final double FOCAL_LENGTH = 500;
...
BufferedImage bi = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
Graphics2D g = bi.createGraphics();
for (Coordinate coordinate : coordinates) {
double latitude = Double.valueOf(coordinate.getLatitude());
double longitude = Double.valueOf(coordinate.getLongitude());
latitude = latitude * Math.PI / 180;
longitude = longitude * Math.PI / 180;
double x = EARTH_RADIUS * Math.sin(latitude) * Math.cos(longitude);
double y = EARTH_RADIUS * Math.sin(latitude) * Math.sin(longitude); …Run Code Online (Sandbox Code Playgroud) java google-maps latitude-longitude cartesian coordinate-transformation
我有一个简单的控制器,如下所示: -
@Controller
@RequestMapping(value = "/groups")
public class GroupsController {
// mapping #1
@RequestMapping(method = RequestMethod.GET)
public String main(@ModelAttribute GroupForm groupForm, Model model) {
...
}
// mapping #2
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public String changeGroup(@PathVariable Long id, @ModelAttribute GroupForm groupForm, Model model) {
...
}
// mapping #3
@RequestMapping(method = RequestMethod.POST)
public String save(@Valid @ModelAttribute GroupForm groupForm, BindingResult bindingResult, Model model) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,此页面具有以下功能: -
/groups GET)./groups POST)或选择特定组(/groups/1 GET …我只是想知道人们如何测试并断言"预期"集合与"实际"集合相同/相似(顺序并不重要).
为了执行这个断言,我编写了我的简单断言API: -
public void assertCollection(Collection<?> expectedCollection, Collection<?> actualCollection) {
assertNotNull(expectedCollection);
assertNotNull(actualCollection);
assertEquals(expectedCollection.size(), actualCollection.size());
assertTrue(expectedCollection.containsAll(actualCollection));
assertTrue(actualCollection.containsAll(expectedCollection));
}
Run Code Online (Sandbox Code Playgroud)
嗯,它的工作原理.如果我断言只是一堆整数或字符串,这很简单.例如,如果我试图断言Hibernate域的集合,那也可能会非常痛苦.collection.containsAll(..)依赖于equals(..)来执行检查,但我总是覆盖我的Hibernate域中的equals(..)以仅检查业务键(这是最好的做法,在Hibernate网站)而不是该域的所有字段.当然,检查业务键是有意义的,但有时我真的想确保所有字段都正确,而不仅仅是业务键(例如,新的数据输入记录).所以,在这种情况下,我无法搞乱domain.equals(..
我可以在这里使用一些测试库吗?你如何测试你的收藏?
谢谢.
请原谅我发布这个noob问题,但我现在已经调试了这个问题很长一段时间了.我在尝试获取响应以基于对象返回XML时遇到一些问题: -
@RequestMapping(value = "/mylink", method = RequestMethod.GET)
public @ResponseBody SomeObject doIt() {
...
}
Run Code Online (Sandbox Code Playgroud)
现在,即使调用该API,我的客户端也根本不会收到XML响应.我一直在阅读一些地方,似乎我需要配置XML marshaller或一些XML解析器,但我不确定如何将该部分集成到我现有的配置中.我目前在servlet.xml中有以下配置: -
<context:component-scan base-package="ss.controller" />
<mvc:annotation-driven />
<mvc:resources location="/resources/" mapping="/resources/**" />
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/app/" />
<property name="suffix" value=".jsp" />
</bean>
Run Code Online (Sandbox Code Playgroud)
有人可以发布一些示例配置,说明如何配置我的servlet.xml以使其正常工作吗?非常感谢.
我现在已经调试了一段时间了,我希望有人能在这里说清楚.
我有一个使用JDK 1.6添加到Jenkins的Maven项目.我在这个项目中使用AOP来处理数据库事务.
当我在Jenkins中运行构建时,我的测试用例失败,但有以下例外: -
Caused by: org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'dataHandlerClassificationImpl':
Injection of resource dependencies failed; nested exception is
org.springframework.beans.factory.BeanNotOfRequiredTypeException:
Bean named 'writerDataLocationImpl' must be of type [xxx.script.WriterData],
but was actually of type [$Proxy17]
...
...
Caused by: org.springframework.beans.factory.BeanNotOfRequiredTypeException:
Bean named 'writerDataLocationImpl' must be of type [xxx.script.WriterData],
but was actually of type [$Proxy17]
...
...
Run Code Online (Sandbox Code Playgroud)
该DataHandlerClassificationImpl课程看起来像这样: -
@Service
public class DataHandlerClassificationImpl extends DataHandler {
@Resource(name="writerDataLocationImpl")
private WriterData writerData;
...
}
Run Code Online (Sandbox Code Playgroud)
WriterData 是一个具有多个实现的接口.
我能够在没有问题的情况下从IDE执行代码.为了确定它是Maven问题还是Jenkins问题,我使用命令行导航到Jenkins的项目作业文件夹,我能够毫无错误地运行mvn test …
如果我将现有的Restful Web服务转换为尽可能的HATEOS,我一直在阅读很多关于潜在好处的内容.我理解在有效负载中提供链接的重要性,以减少消费者在记住下一个有效可用操作时的负担.但是,我似乎无法理解它将如何帮助我的Restful Web服务的消费者实际.
为了说明这一点,我从" 休息实践"一书中摘取了关于制作咖啡订单的例子: -
<order xmlns="http://schemas.restbucks.com">
<location>takeAway</location>
<item>
<name>latte</name>
<quantity>1</quantity>
<milk>whole</milk>
<size>small</size>
</item>
<cost>2.0</cost>
<status>payment-expected</status>
<link rel="payment" href="https://restbucks.com/payment/1234" />
</order>
Run Code Online (Sandbox Code Playgroud)
基本上,这允许消费者进行由<link>标签定义的支付.然而,实际上,消费者仍然需要知道该Web服务调用的所有语义,例如,使用什么方法(POST或PUT),在有效载荷中使用哪些请求参数以进行支付等.换句话说,消费者仍然需要依赖WADL文档来了解如何成功调用此Web服务.如果他们都在一个特定项目上使用GET,这些标签可能更有意义.否则,我真的没有看到在这里定义链接的好处...除了消费者知道他们接下来可以调用什么动作的事实,然后参考WADL来确定如何正确地调用它.
我的下一个问题是有可能以所有<link>标签结束非常重的有效载荷.例如,如果/ projects/1/users上的GET返回属于项目1的所有用户信息,我假设我最终会得到以下标记: -
<project>
<users>
<user id="12" name="mike" ... />
<user id="23" name="kurt" ... />
<user id="65" name="corey" ... />
</user>
<links>
<link rel="self" href="http://server/projects/1/users"/>
<link rel="create_user" href="http://server/projects/1/users"/>
<link rel="get_user_mike" href="http://server/projects/1/users/12"/>
<link rel="get_user_kurt" href="http://server/projects/1/users/23"/>
<link rel="get_user_corey" href="http://server/projects/1/users/65"/>
...
</links>
</project>
Run Code Online (Sandbox Code Playgroud)
如果一个项目包含说,500个用户......我不会在有效负载中有500个用户链接吗?否则,重新设计我的Web服务以处理这种情况的最佳方法是什么?或者这在现实世界中是否可以接受?
任何想法或建议在这里都非常感激.谢谢.
我的工作项目中有很多实例需要在一个句子中显示某些集合的大小.例如,如果集合的大小为5,则表示"5个用户".如果它的大小为1或0,则表示"1个用户"或"0个用户".现在,我正在用if-else语句来确定是否打印"s",这很乏味.
我想知道是否有一个开源JSP自定义标记库,它允许我完成这个.我知道我自己可以写一个...基本上,它会有2个这样的参数:<lib:display word="user" collection="userList" />.根据集合大小,它将决定是否附加"s".但是,这个实现不会太强大,因为我还需要处理"ies",有些词不使用任何这些.因此,我希望有一个更强大的库可以立即使用,而不是创建一个半生不熟的工具.在这种情况下,我并不太担心用is/are作为前缀.
顺便说一句,我使用Java.
非常感谢.
我目前已经存在与SVN存储库绑定的Intellij IDEA项目.我正在考虑将这些项目切换为使用Git SVN,因为当我没有连接到SVN存储库时,我发现需要一个本地版本控制系统.
由于Intellij IDEA不提供Git SVN网桥,我从命令行运行以下命令将SVN存储库克隆到Git: -
git svn clone --stdlayout --username myuser http://svnrepo/myproject -A authors.txt myproject
Run Code Online (Sandbox Code Playgroud)
克隆SVN存储库后,我使用Intellij IDEA打开基于Git的项目.此时,Intellij IDEA抱怨缺少版本控制目录.我发现Intellij IDEA仍然记得旧的SVN配置.由于项目现在包含.git目录而不是.svn目录,因此Intellij IDEA会感到困惑,并且它现在不知道如何连接到任何存储库.
对我有用的唯一解决方法是执行以下操作: -
也就是说,我不能在一台机器上运行这个Intellij IDEA项目的Git,同时在另一台机器上的这个Intellij IDEA项目上使用SVN.两台机器都必须使用Git,否则Intellij IDEA将无法提交到版本控制存储库.我对此很好,我可以在我的所有机器中使用Git.但是,我正试图找到一种方法,不为我现有的基于SVN的项目创建全新的基于Git的项目.这非常繁琐,因为我现在需要使用Git运行很多SVN项目.
有没有更好的解决方案让我使用Intellij IDEA将SVN项目切换到Git?
谢谢.
我在使用Servlet 2.5让Spring Framework 4与我现有的项目一起工作时遇到了问题.我的web项目实际上运行正常,但我的测试用例失败并且它是由引起MockHttpServletRequest此异常引起的: -
java.lang.NoClassDefFoundError: javax/servlet/AsyncContext
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
Run Code Online (Sandbox Code Playgroud)
我尝试添加任一依赖项,但我会得到其他与Servlet 3.0相关的异常: -
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>servlet-api</artifactId>
<version>3.0.20090124</version>
<scope>test</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
基于Spring Framework网站,它可以与Servlet 2.5一起使用.但是,Spring 4MockHttpServletRequest似乎依赖于Servlet 3.0.
我该如何解决这个问题?谢谢.
java ×7
spring ×4
junit ×2
spring-mvc ×2
unit-testing ×2
xml ×2
cartesian ×1
git ×1
git-svn ×1
google-maps ×1
hateoas ×1
hudson ×1
jenkins ×1
jsp ×1
jsp-tags ×1
rest ×1
spring-test ×1
svn ×1
testing ×1
web-services ×1