我正在使用Spring MVC和Spring安全版本3.0.6.RELEASE。 在我的JSP中获取用户名最简单的方法是什么? 甚至只是用户是否login? 我可以想到一些方法: 1.使用scriptlet 使用这样的脚本来确定用户是否login: <%=org.springframework.security.core.context.SecurityContextHolder.getContext() .getAuthentication().getPrincipal().equals("anonymousUser") ? "false":"true"%> 我不喜欢使用scriptlet,而且我想在一些<c:if>标签中使用它,这需要把它作为页面属性。 2.使用SecurityContextHolder 我可以再次从我的@Controller使用SecurityContextHolder并将其放在模型上。 不过,我在每一页上都需要这个,所以我宁愿不必在每一个控制器中添加这个逻辑。 我怀疑有一个更清洁的方法来做到这一点…
在开始之前,我要说我发现的最接近的答案就是在这里,但老实说,我并不真正了解那里发生了什么。 我正在使用带有自定义身份validation提供程序和访问决策pipe理器的Struts2 + Spring Security 2.06来删除“ROLE_”前缀的需要。 我的applicationContext-security.xml如下所示: <beans:bean id="customAuthenticationProvider" class="com.test.testconsole.security.CustomAuthenticationProvider"> <beans:property name="userManagementService" ref="userManagementService"/> <custom-authentication-provider/> </beans:bean> <!–Customize Spring Security's access decision manager to remove need for "ROLE_" prefix–> <beans:bean id="accessDecisionManager" class="org.springframework.security.vote.AffirmativeBased"> <beans:property name="decisionVoters"> <beans:list> <beans:ref bean="roleVoter"/> <beans:ref bean="authenticatedVoter"/> </beans:list> </beans:property> </beans:bean> <beans:bean id="roleVoter" class="org.springframework.security.vote.RoleVoter"> <beans:property name="rolePrefix" value=""/> </beans:bean> <beans:bean id="authenticatedVoter" class="org.springframework.security.vote.AuthenticatedVoter"> </beans:bean> <global-method-security secured-annotations="enabled" access-decision-manager-ref="accessDecisionManager"/> 我的web.xml的相关部分: […]
我想向任何login的用户显示内容,如果他们没有login,将隐藏内容。我使用jsp和spring安全。 显然,家庭解决scheme很容易完成。 但是,实现这一目标的最简洁的标准方法是什么? Spring安全标签似乎没有很好的方法,将来可以添加新的angular色。
我正在使用Spring Security 3.0与LDAP服务器进行身份validation,我不知道设置我自己的会话超时期限。 我相信默认是30分钟,但我需要将其设置为比这更长
有没有教程或有没有人有关于如何使用Spring-Security做以下指示? 任务: 我需要从我的数据库中获取validation用户名的salt,并使用它来对提供的密码(从login页面)进行encryption,以便将其与存储的encryption密码(也就是对用户进行身份validation)进行比较。 附加信息: 我使用自定义的数据库结构。 UserDetails对象是通过自定义的UserDetailsService创build的,而UserDetailsService则使用自定义的DAOProvider从数据库中获取信息。 我的security.xml文件到目前为止: <authentication-manager> <authentication-provider user-service-ref="userDetailsService"> </authentication-provider> </authentication-manager> 现在我想我会需要 <password-encoder hash="sha" /> 但还有什么? 如何告诉spring安全使用数据库提供的salt来编码密码? 编辑 : 我发现这个SOpost是信息性的,但不够:如果我在我的xml中定义一个盐密码源以供密码编码器使用,如下所示: <password-encoder ref="passwordEncoder"> <salt-source ref="saltSource"/> </password-encoder> 我将不得不写一个自定义SaltSource来使用我的自定义盐。 但是这不是在UserDetails对象内部find的。 所以… 备选案文1: 我可以使用自定义UserDetails的实现,然后可能有salt属性? <beans:bean id="saltSource" class="path.to.MySaltSource" p:userPropertyToUse="salt"/> 和 @Service("userDetailsService") public class UserDetailsServiceImpl implements UserDetailsService { public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException { // … return buildUserFromAccount(account); […]
我需要从数据库authentication用户,Spring Security文档不告诉如何用hibernate进行authentication。 这是可能的,我该怎么做?
我希望能够在Web应用程序中logging用户活动。 我目前正在使用log4j这适用于logging错误等,但我不确定最好的方法是logging用户,执行servlet方法和方法参数。 我正在使用spring security进行身份validation。 一个典型的servlet可能如下所示: public class BankAccountServlet { @RequestMapping("/deposit") public void deposit(double amount) { … } @RequestMapping("/checkBalance") public double checkBalance() { … } } 如果有两个用户foo和bar,foo检查他的余额,并且存入两个现金10.00和5.00。 我希望日志看起来像: 01/01/1970 23:59:59 – foo – checkBalance 02/01/1970 23:59:59 – bar – deposit – 10.00 02/01/1970 23:59:59 – bar – deposit – 5.00 如果有人能提供一些build议,我真的很感激他们的帮助。
我是Spring MVC框架的新手,我有一个我自己无法解决的问题。 一切都从我的应用程序集成Spring安全性开始,之后,所有来自HTML表单的unicode值都没有被编码(spring安全工作正常)。 我得出的结论是,这可能是因为我的DelegatingFilterProxy被称为链中的第一个filter。 这是我认为会起作用的configuration,但它不是: 1)我正在扩展AbstractSecurityWebApplicationInitializer – 从javadoc: Registers the DelegatingFilterProxy to use the springSecurityFilterChain() before any other registered Filter. 从那个类我也覆盖Spring关于javadoc的SpringSecurityFilterChain方法: Invoked before the springSecurityFilterChain is added. 所以我认为这将是注册CharacterEncodingFilter的最佳地点: public class MessageSecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer { @Override protected void beforeSpringSecurityFilterChain(ServletContext servletContext) { FilterRegistration.Dynamic characterEncodingFilter = servletContext.addFilter("encodingFilter", new CharacterEncodingFilter()); characterEncodingFilter.setInitParameter("encoding", "UTF-8"); characterEncodingFilter.setInitParameter("forceEncoding", "true"); characterEncodingFilter.addMappingForUrlPatterns(null, true, "/*"); } } […]
春季安全可以在Spring控制器方法上使用@PreAuthorize吗?
新用户提交“新帐户”表单后,我想手动将该用户login,以便他们不必在后续页面上login。 通过spring安全拦截器的正常forms的login页面工作得很好。 在新帐户表单控制器中,我将创build一个UsernamePasswordAuthenticationToken并手动将其设置在SecurityContext中: SecurityContextHolder.getContext().setAuthentication(authentication); 在同一页上,我稍后检查用户是否login: SecurityContextHolder.getContext().getAuthentication().getAuthorities(); 这返回了我之前在身份validation中设置的权限。 一切都很好。 但是,当我加载的下一页上调用相同的代码时,身份validation令牌只是UserAnonymous。 我不清楚为什么它没有保持我以前的请求设置的身份validation。 有什么想法吗? 会话ID的设置是否正确? 有什么可能覆盖我的身份validation? 也许我只需要另一个步骤来保存身份validation? 还是有什么我需要做的是在整个会话中声明身份validation,而不是一个单一的请求? 只是寻找一些想法,可以帮助我看看这里发生了什么。