在服务层映射Shiro异常

时间:2013-08-11 19:15:35

标签: spring spring-mvc shiro

我正在使用Spring 3.2.3和Shiro 1.2.0来保护对服务的访问。这样可行,但会导致抛出特定于Shiro的异常。我想抛出一个特定于应用程序的异常。这是可能的,无论是Shiro还是Spring级别的映射?我知道我可以使用Spring将控制器异常映射到视图,但我不确定如何在服务层处理它。我的设置:

服务界面:

public interface CaseService {
  Case getCase(Integer id);
}

服务实施:

@Service
public class CaseServiceImpl implements CaseService {
  @RequiresAuthentication
  public Case getCase(Integer id) {
    // ...
  }
}

在没有经过身份验证的Subject测试上面的内容时,我确实收到了预期的异常,但它是一个org.apache.shiro。* one。我尝试使用Spring的@ExceptionHandler来处理Shiro异常。它没有任何效果,但我认为它需要在控制器层工作。

1 个答案:

答案 0 :(得分:1)

如果没有理由你绝对需要使用@RequiresAuthentication批注,可以调用以下自定义实用程序类来返回所需的异常。

public class UserAuthenticationUtil {
  /**
   * Check that the current user bound to {@link ThreadLocal} is authenticated.
   * @throws ApplicationSpecificException If the current user is not authenticated.
   */
  public static void checkUserAuthenticated () throws ApplicationSpecificException {
    if (!SecurityUtils.getSubject().isAuthenticated()) {
      throw new ApplicationSpecificException("User is not authenticated!");
    }
  }
}

Here is the code/class处理@RequiresAuthentication注释,如果你想验证它是相同的逻辑。 Here is the API documenation也是如此。