Tag: spring security

为什么我的自定义PermissionEvaluator不起作用?

我无法理解为什么我的安全性无法正常工作。 方法hasPermission()在Evaluator类中甚至没有被调用。 我认为我的安全配置有问题。 我的安全配置: 这是我的自定义评估者: public class UserPermissionEvaluator implements PermissionEvaluator { private UserService service; @Autowired public UserPermissionEvaluator(UserService service) { this.service = service; } @Override public boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission) { UserDetails principal = (UserDetails) authentication.getPrincipal(); User authorizedUser = service.getUser(principal.getUsername()); Collection userPermissions = authorizedUser.getPermissions(); for (Permission p : userPermissions) { if […]

处理Spring Security中的自定义exception

我们正在使用spring MVC + spring security + hibernate创建一个RESTful API。 API可以生成JSON和HTML。 为弹簧安全做一个好的error handling让我很头疼: 身份validation可以通过各种方式进行:BasicAuth,通过POST请求中的不同参数以及Web登录。 对于每个身份validation机制,在spring security xml config的 namespace元素中声明了一个filter。 我们在自定义HandlerExceptionResolver处理所有springexception。 这适用于我们的控制器中抛出的所有exception,但我不知道如何处理自定义spring安全filter中引发的自定义exception。 由于spring安全filter在我们调用任何控制器之前到来,因此我们没有看到我们在自定义spring安全filter中抛出的exception。 我在stackoverflow上找到了这个问题: 在Spring Security中使用自定义exception 。 但是我不明白他们在哪里处理那里抛出的exception。 我们尝试了这种方法,但我们没有调用自定义的HandlerExceptionResolver 。 而是向用户呈现由tomcat呈现的丑陋堆栈跟踪。 我们为什么需要这个? 可以激活和停用用户。 如果它们被停用并尝试执行某些操作,我们希望返回带有自定义错误消息的JSON。 这应该与spring security抛出AccessDeniedException时显示的内容不同。 AccessDeniedException以某种方式使它成为我们的HandlerExceptionResolver ,但我无法完全遵循。 可能的解决方案我们考虑过使用ExceptionTranslationFilter ,但是当我们抛出自定义exception(在doFilter()方法的catch语句中设置断点)时,不会调用它。 在我的理解中,应该调用这个catch块,并且应该使用认证入口点。 另一种可能性:我们可以在spring安全filter链中执行与ExceptionTranslationFilter类似的操作,并执行与AccessDeniedHandler类似的操作: RequestDispatcher dispatcher = request.getRequestDispatcher(errorPage); dispatcher.forward(request, response); 我们可以在请求中添加一些参数(错误代码,原因等)并让它指向一个控制器,它将处理JSON或HTML中的渲染。 以下是我们配置的简短摘录: 春季安全: HandlerExceptionResolver的AppConfig @Bean public HandlerExceptionResolver handlerExceptionResolver(){ logger.info(“creating handler […]

Spring Security具有Collection 的Permission

我有使用方法级安全性保护的工作应用程序: RestController: @PreAuthorize(“hasPermission(#product, ‘WRITE’)”) @RequestMapping(value = “/save”, method = RequestMethod.POST) public Product save(@RequestBody Product product) { return productService.save(product); } PermissionEvaluator: public class SecurityPermissionEvaluator implements PermissionEvaluator { private Logger log = LoggerFactory.getLogger(SecurityPermissionEvaluator.class); private final PermissionService permissionService; public SecurityPermissionEvaluator(PermissionService permissionService) { this.permissionService = permissionService; } @Override public boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission) { CustomUserDetails userDetails […]

Spring Security条件default-target-url

我注意到有几个问题询问这个话题。 我查看了它们,我无法将它们应用到我特定的Spring设置中。 我想根据用户的角色将我的登录重定向配置为有条件的。 这是我到目前为止: 我认为这个问题可能与我想要做的事情在同一条线上。 有人知道我怎么能申请吗? 编辑1 编辑2 目前我没有类public class Test implements AuthenticationSuccessHandler {} ,如本例所示。

Spring安全性从更深层访问UserDetailsS​​ervice

我有以下UserDetailsS​​ervice实现。 到目前为止,身份validation过程非常有效。 如何在“会话”中存储我的“MyUser bean”( 已成功登录 ),以便我可以在我的应用程序的其他区域中访问它 谢谢。 @Transactional(readOnly = true) public class CustomUserDetailsService implements UserDetailsService { private EmployeesApi employeesApi = new EmployeesApi(); /** * Retrieves a user record containing the user’s credentials and access. */ public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException, DataAccessException { // Declare a null Spring User UserDetails user = null; try { […]

用于层次结构树角色的Spring Security / Java EE解决方案

我知道Spring Security适用于标准角色和基于权限的授权。 我不确定这种情况: 系统中管理着10,000名员工,员工组织成组织结构图(一组人员向各部门报告)。 其中一些员工是用户。 这些用户仅被允许访问其职责范围内的员工(他们在树中的分支/其员工的后代)。 所以我想知道现代Java EE(或其他)系统如何管理这些检查? Spring Security(ACL)可以做到这一点吗?如何建模? 我们的旧实现(多年前)是当用户访问员工时,我们可以通过递归树来检查所请求的员工是否是后代。 但这不是理想的解决方案,我们希望使用新的解决方案。

在Spring 3.1 Java Config中引用Spring Security配置

我最近切换了大部分Spring配置,在Spring 3.1中使用基于代码的配置。 但是,现在我已经切换,我的Spring Security无法正常工作,并在Tomcat启动时抛出以下错误: SEVERE: Exception starting filter springSecurityFilterChain org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named ‘springSecurityFilterChain’ is defined 我仍然在XML文件中有Spring Security,并且知道这不能在Spring中转换为Java配置,因为它是一个自定义命名空间,但是,我在我的Java配置文件中引用它。 我还尝试将applicationContext-security.xml配置引用从Java配置移动到我的web.xml,没有任何运气。 @Configuration @EnableWebMvc @Import(ServicesConfig.class) @ImportResource({ “classpath:applicationContext-security.xml”, “classpath:dataSources.xml” }) @ComponentScan(basePackages = “com.foobar”) public class WebConfig { // left out Beans for clarity } 的applicationContext-security.xml文件: web.xml : My App contextClass org.springframework.web.context.support.AnnotationConfigWebApplicationContext contextConfigLocation foobar.WebConfig springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy springSecurityFilterChain /* org.springframework.web.context.ContextLoaderListener dispatcher […]

Spring Security OAuth2简单配置

我有一个简单的项目,需要简单的以下配置: 我有一个“密码”grant_type,这意味着我可以提交用户名/密码(用户在我的登录表单中输入),并在成功时获得access_token。 通过该access_token,我可以请求API并获取用户的信息。 我知道API的URI,我不想要任何大的东西(我在https://github.com/spring-projects/spring-security-oauth/tree/master/samples上看到了配置)并且看起来很大。 我可以这样想: 做一个简单的HTTP请求,给出* client_id *,* client_secret *,* grant_type =密码*, 用户名和密码 (用户提供的)。 我在JSON响应中收到* ACCESS_TOKEN *(以及其他一些东西)。 我使用* ACCESS_TOKEN *来查询URL(使用简单的GET请求),它将提供用户的信息。 我在HttpSession中设置信息并将用户视为已登录。 它可以在2个HTTP请求中完成。 我只是不想这样做,而是使用“更安全”的方式而不是Spring Security OAuth2。 你能想到我需要做什么“简单”配置才能完成这项工作吗?

将用户添加到会话,弹出安全性默认登录

我已设置spring security以正确拦截并使用自定义登录页面提示用户,然后正确进行身份validation并将用户详细信息添加到SecurityContextHolder。 补充一点,我现在想要在执行登录时添加我自己的自定义User对象添加到会话中; 所以代码看起来像这样: public returnwhat? doMySupplementaryLogin() { UserDetails principal = (UserDetails) SecurityContextHolder.getContext() .getAuthentication().getPrincipal(); MyUser user = myUserService.getMyUser(principal.getUsername()); add user to what ? } 这段代码会在哪里? 我希望执行nomral spring身份validation,然后上面的代码将MyUser对象放入会话,然后将用户发送到原始拦截的url / viewname。 我有强烈的感觉,我使事情变得比他们需要的更复杂……

MVC拦截器与Spring安全filtervs其他东西……?

我在我的Web应用程序中使用Spring-MVC和Spring Security。 它包括用户注册页面和私人用户面板。 我现在设置了以下url模式: whatever/myapp/login用户登录 whatever/myapp/register?step=1开始注册 whatever/myapp/account/**私人区域视图(页面) 在注册后流程完成时显示的whatever/myapp/pending视图 whatever/myapp/blocked帐户被阻止的视图 如果注册失败, whatever/myapp/register/retry ,都允许重试 基本上,下面的这些URL应该要求用户身份validation,即需要登录: whatever/myapp/account/** (私人区域页面) whatever/myapp/pending (此页面有一个定时器设置为重定向到/ account / home) whatever/myapp/register/retry 使用Spring安全性非常简单。 但是,无论通过Spring安全性进行用户身份validation,私有区域页面都应该是可访问的,具体取决于用户的当前帐户状态(存储在我的数据库中)。 更具体地说:如果用户试图访问私有区域( /account/** )中的任何内容,则应根据状态向他显示相应的视图(重定向到适当的页面)。 我定义了这些状态: suspended – 与待审视图有关 enabled – 允许完全访问权限 disabled – 这里不相关 retry_allowed – 与重试视图有关 blocked – 与帐户被阻止的视图有关 目前,我有一个MVC拦截器设置到/account/** ,它检查用户状态,并重定向到适当的页面,但不知怎的,我觉得这不是真正理想或适当的解决方案,因为我面临奇怪行为,就像多个控制器调用一样…而且我不太确定何时在preHandle()方法中返回true / false 。 这是拦截器的代码片段: @Override public boolean preHandle( HttpServletRequest request, HttpServletResponse […]