小编Ral*_*lph的帖子

配置Spring Security以使用自定义UsernamePasswordAuthenticationFilter

我实现了自己的LowerCaseUsernamePasswordAuthenticationFilter,只是一个子类UsernamePasswordAuthenticationFilter.

但现在我的问题是,如何配置Spring安全性来使用此过滤器.

到目前为止我用过:

<security:http auto-config="true" use-expressions="true">
    <security:form-login login-processing-url="/resources/j_spring_security_check" login-page="/login" authentication-failure-url="/login?login_error=t" />
    <security:logout logout-url="/resources/j_spring_security_logout" />

    <security:intercept-url pattern="/**" access="isAuthenticated()" requires-channel="${cfma.security.channel}" />
</security:http>
Run Code Online (Sandbox Code Playgroud)

我是否真的auto-config需要手动配置所有过滤器? - 如果这是真的,有人可以提供一个例子吗?


添加简单的方法security:custom-filter:

<security:http ...>

   <security:form-login login-processing-url="/resources/j_spring_security_check" login-page="/login" authentication-failure-url="/login?login_error=t" />
   <security:custom-filter ref="lowerCaseUsernamePasswordAuthenticationFilter" position="FORM_LOGIN_FILTER"/>
   ...
 </security:http>
Run Code Online (Sandbox Code Playgroud)

确实导致该消息的异常:

配置问题:过滤bean <lowerCaseUsernamePasswordAuthenticationFilter>和'Root bean:class [org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter]; 范围=; 抽象= FALSE; lazyInit = FALSE; autowireMode = 0; dependencyCheck = 0; autowireCandidate = TRUE; 初级= FALSE; factoryBeanName = NULL; factoryMethodName = NULL; initMethodName = NULL; destroyMethodName = null'具有相同的'order'值.使用自定义过滤器时,请确保这些位置与默认过滤器不冲突. …

java spring spring-security

14
推荐指数
1
解决办法
3万
查看次数

如何使用Spring Security 3.1更改当前用户的登录名?

我要求每个用户在登录时都可以更改自己的用户名.问题是如何Principal在Spring Security的身份验证令牌中更新用户名()?

(我必须更新它,因为我使用身份验证令牌中的原始名称来识别某些业务用例中的用户.)

我使用基于表单和cookie记住我的登录,所以我的身份验证令牌是UsernamePaswordAuthenticationTokenRememberMeAuthenticationToken.两者都有一个principal存储登录名的字段.不幸的是这个变量是final,所以我不能改变它的价值.

有没有人知道Spring Security如何推荐更改Principal身份验证令牌?

我现在workarround是,我更换了UsernamePaswordAuthenticationToken,并RememberMeAuthenticationToken与具有额外的不是最终的主要领域和覆盖的子类getPrincipal()的方法,而不是回到原来的这种额外的本金.然后我还将生成此标记的两个类子类化,以创建我的标记而不是原始标记.---但我觉得这是一个很大的黑客.

java spring spring-security

14
推荐指数
3
解决办法
9852
查看次数

泛型与方法重载

我有3种方法:

//1 -- check one item
public static <T> void containsAtLeast(String message,
                                       T expectedItem,
                                       Collection<? extends T> found) {
    if (!found.contains(expectedItem))
        Assert.fail("...");        
}

//2 -- check several items
public static <T> void containsAtLeast(String message,
                                       Collection<? extends T> expectedItems,
                                       Collection<T> found) {
    for (T exptetedItem : expectedItems)
        containsAtLeast(message, exptetedItem, found);        
}

//3 -- check several items, without message parameter
public static <T> void containsAtLeast(Collection<? extends T> expectedItems,
                                       Collection<? extends T> found) {
    containsAtLeast(null, expectedItems, found);
}
Run Code Online (Sandbox Code Playgroud)

我希望该方法可以//3调用//2 但不会调用方法 …

java generics

14
推荐指数
1
解决办法
564
查看次数

如何从SimpleMappingExceptionResolver中排除ClientAbortException

我正在使用SimpleMappingExceptionResolver,它将所有异常发送到一个很好地呈现它的视图.除了一种情况之外,这是有效的:如果用户请求一个页面,然后发送并"中止"(不确切知道它是如何工作的,但我注意到如果我非常快速地点击HTTP帖子表单提交按钮而且经常是Firefox 7以某种方式通知服务器它不再对结果感兴趣.)然后ClientAbortException当一个人尝试渲染页面时,Tomcat 6会上升,或者写出任何类型的http响应.

现在开始麻烦:SimpleMappingExceptionResolver"捕获"异常并尝试将其很好地呈现给html页面.这会导致Stream已经关闭的异常,这会污染日志文件.(java.lang.IllegalStateException: getOutputStream() has already been called for this response)

我所做的就是为"ClientAbortException"注册一个空的jsp页面.但我觉得这是一个哈克.另一方面,我想这不是一个非常不常见的问题,因为我会期望它几乎在每个春季应用程序中呈现所有异常.那么有没有人有这个问题的经验,或者有一个不那么hacky解决方案的想法?

<bean
  class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"
  p:defaultErrorView="uncaughtException">
    <property name="exceptionMappings">
        <props>
           <prop key=".MissingServletRequestParameterException">
               resourceNotFound
           </prop>
           <prop key=".ClientAbortException">nothing</prop>
        </props>
     </property>
</bean>
Run Code Online (Sandbox Code Playgroud)

java spring tomcat exception-handling

13
推荐指数
1
解决办法
3557
查看次数

登录时更改区域设置

我想在登录到使用Spring Security(3.0)的用户帐户Spring MVC Application(3.0)中存储的默认语言环境后更改语言环境.

我已经使用了LocaleChangeInterceptor这样一个(未登录,以及登录)用户可以更改其语言环境(默认来自accept标头).但客户确实希望该帐户具体默认.

所以我的问题是,登录后更改语言环境的最佳方法是什么,或者Spring/Security中是否已经有一些内置功能?

java spring spring-security internationalization

13
推荐指数
1
解决办法
1万
查看次数

如何使用Spring属性配置Velocity Escape Tool?

我在Spring Web Application中通过Velocity从模板创建电子邮件.现在我需要HTML转义一些值.我找到了Velocity 逃生工具.但我没有让配置工作.

我试过这样的票价是(spring applicationContext.xml):

<bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
    <property name="resourceLoaderPath" value="classpath:/velocity/emailTemplates" />
    <property name="preferFileSystemAccess" value="false" />
    <property name="overrideLogging" value="true" />
    <property name="velocityProperties">
        <util:properties>
            <prop key="input.encoding">UTF-8</prop>
            <prop key="output.encoding">UTF-8</prop>
            <prop key="tools.toolbox">application</prop>
            <prop key="tools.application.esc">org.apache.velocity.tools.generic.EscapeTool</prop>
        </util:properties>
    </property>
</bean>
Run Code Online (Sandbox Code Playgroud)

模板(htmlEscapeTest.vm):

with escape: $esc.html($needEscape)
Run Code Online (Sandbox Code Playgroud)

测试用例:

@Test
public void testHtmlEscapingSupport() {

    final String needEscape = "<test>";

    ModelMap model = new ModelMap();
    model.addAttribute("needEscape", needEscape);
    String result = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, HTML_ESCAPING_TEMPLATE_FILE, model);
    assertThat(result, StringContains.containsString("&lt;test&gt;"));
}
Run Code Online (Sandbox Code Playgroud)

但测试失败了, ...got: "with escape: $esc.html($needEscape)"

谁能给我一个提示我做错了什么?


如果我new EscapeTool()在测试中添加explicite:

VelocityContext velocityContext = …
Run Code Online (Sandbox Code Playgroud)

java spring velocity

12
推荐指数
2
解决办法
8632
查看次数

Spring Security Meta Annotation

是否有可能构建Spring Security的Meta Annotatations,@PreAuthorize如for @Component@Qualifier

我想要做的是用@PreAuthorize("hasRole('ADMIN')")像这样的快捷方式替换@IsAdmin.但我没有在文档中找到任何提示.

java spring annotations spring-security

11
推荐指数
1
解决办法
1438
查看次数

使用Maven程序集合并属性文件

我有maven程序集插件的问题.

我有一个使用几个罐子的maven项目.每个jar包含配置文件.在另一个项目中,我使用maven程序集插件来组装独特jar中的所有配置.

一切正常,但不幸的是,两个文件名相同,第二个文件覆盖第一个.

我没有实现告诉maven合并两个文件而不是覆盖.

有人知道怎么做吗?

谢谢.

java maven-plugin maven maven-assembly-plugin

11
推荐指数
3
解决办法
2万
查看次数

如何通过反射获取类及其父类的私有字段?

我在命名空间Domain中有B类及其父类A.

  • A类,有私人领域a;
  • B类,有私人领域b;

然后我在名称空间Reflect中有一个Reflection Util.如果我使用这一行

instanceOfB.GetType().GetFields(BindingFlags.NonPublic 
         | BindingFlags.Public | BindingFlags.Instance );
Run Code Online (Sandbox Code Playgroud)

要查找所有字段(a和b),我只得到b.但是,当我a受到保护或公开时,我也会发现它们.

我还需要做些什么才能找到基类的私有字段?

c# reflection visibility

11
推荐指数
1
解决办法
8265
查看次数

如何从arquillian.xml中通过qualifyer选择容器?

我希望在arquillian.xml中有不同的容器配置,并在我的测试中选择它们.但我无法加载任何容器,但默认加载.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<arquillian
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://jboss.org/schema/arquillian"
    xsi:schemaLocation="http://jboss.org/schema/arquillian http://www.jboss.org/schema/arquillian/arquillian_1_0.xsd">

    <container qualifier="weld" default="false">
    </container>
</arquillian>
Run Code Online (Sandbox Code Playgroud)

测试用例:

@Deployment(name="depl1")
@TargetsContainer("weld")
public static JavaArchive createTestArchive() throws UnsupportedEncodingException {
    return ShrinkWrap
            .create(JavaArchive.class, "test.jar")
            .addClasses(SomeOtherCdiService.class)
            .addAsManifestResource(new ByteArrayAsset(beansXmlContent.getBytes("utf-8")), ArchivePaths.create("beans.xml"));
}

@Test
@OperateOnDeployment("depl1")
public void shouldBeAbleToInjectInject() {
    assertNotNull(someOtherCdiService);
}
Run Code Online (Sandbox Code Playgroud)

但测试没有开始,因为Arquilian找不到容器

org.jboss.arquillian.container.test.impl.client.deployment.ValidationException:DeploymentScenario包含与注册表中任何已定义Container不匹配的目标.焊接.可能的原因是:在Classpath上找不到可部署的容器,或者您已经使用@ org.jboss.arquillian.container.test.api.TargetsContainer值定义了@ org.jboss.arquillian.container.test.api.Deployment.任何找到/配置的容器(请参阅arquillian.xml容器@限定符)

我查看了源代码,发现Aquilian只找到了_DEFAULT_Container.

当我@TargetsContainer("weld")从部署方法中删除时,测试工作正常.所以我认为一般测试都没问题.

如果我将容器配置修改为default="true"(<container qualifier="weld" default="ture">)然后测试工作,测试也有效,所以我认为配置文件已加载.

有没有人知道出了什么问题?


细节

完成Stacktrace:

org.jboss.arquillian.container.test.impl.client.deployment.ValidationException:
DeploymentScenario contains targets not matching any defined Container in the registry. weld.
Possible causes are: No Deployable …
Run Code Online (Sandbox Code Playgroud)

java testing java-ee cdi jboss-arquillian

11
推荐指数
2
解决办法
1万
查看次数