首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JAAS、Spring Security或Apache Shiro

JAAS、Spring Security和Apache Shiro基础概念及比较

JAAS(Java Authentication and Authorization Service)

基础概念: JAAS是Java平台提供的一种标准的认证和授权服务框架。它允许开发者通过插件化的方式实现用户身份验证和权限管理。

优势

  • 标准化的认证和授权机制。
  • 可插拔的认证提供者,易于扩展。
  • 与Java安全体系紧密集成。

类型

  • 基于用户名/密码的认证。
  • 基于证书的认证。
  • 基于Kerberos的认证等。

应用场景

  • 企业级应用的身份验证和授权。
  • Web应用的登录和权限管理。

Spring Security

基础概念: Spring Security是Spring框架提供的一个全面的安全框架,用于处理认证、授权、攻击防护等安全问题。

优势

  • 与Spring框架深度集成,易于使用。
  • 功能丰富,包括认证、授权、CSRF防护、会话管理等。
  • 高度可配置和可扩展。

类型

  • 表单登录认证。
  • OAuth2认证。
  • OpenID Connect认证等。

应用场景

  • 大型Web应用的安全管理。
  • 微服务架构中的安全控制。

Apache Shiro

基础概念: Apache Shiro是一个简单易用的Java安全框架,提供认证、授权、加密和会话管理等功能。

优势

  • 简单易用,易于上手。
  • 轻量级,不依赖于Spring等大型框架。
  • 支持多种认证和授权方式。

类型

  • 基于用户名/密码的认证。
  • 基于角色的授权。
  • 基于权限的授权等。

应用场景

  • 中小型项目的安全管理。
  • 需要快速集成安全功能的项目。

问题及解决方法

问题1:为什么选择Spring Security而不是JAAS?

原因

  • Spring Security提供了更全面的安全功能,如CSRF防护、会话管理等。
  • Spring Security与Spring框架深度集成,使用更方便。

解决方法

  • 如果项目中已经使用了Spring框架,建议选择Spring Security。
  • 如果需要更高级的安全功能,Spring Security是更好的选择。

问题2:Apache Shiro与Spring Security相比有哪些不足?

原因

  • Apache Shiro的功能相对较少,不如Spring Security全面。
  • Apache Shiro不依赖于Spring框架,但在集成Spring时可能需要额外的工作。

解决方法

  • 如果项目对安全功能要求不高,且希望快速上手,可以选择Apache Shiro。
  • 如果需要更高级的安全功能和更好的Spring集成,建议选择Spring Security。

参考链接

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Hadoop Authentication

    我被被派去做别的事情了,所以与Hadoop相关的工作就只能搁下。写篇总结,把最近遇到的和kerberos相关的东西列一下。 JAAS是Java 认证和授权服务(Java Authentication and Authorization Service)的缩写,是PAM框架的Java实现。 javax.sercurity.auth.Subject是一个不可继承的实体类,它表示单个实体的一组相关信息,与请求的来源相关。 javax.security.auth.Principal是一个接口,表示带有不同类型凭证的标识,基本上来说,Principal可以是任意对象。 JAAS的授权机制主要就是围绕着Subject和Principal。关于JAAS比较详细的参考是这里:http://docs.oracle.com/javase/6/docs/technotes/guides/security/jaas/JAASRefGuide.html 几个比较重要的java属性: java.security.krb5.realm java.security.krb5.kdc java.security.krb5.conf hadoop的身份认证和授权都是建立在JAAS之上。 hadoop.security.authentication属性有2种值: simple: Security is disabled。 kerberos: Security is enabled。 org.apache.hadoop.security.UserGroupInformation有一个静态方法:getCurrentUser()。它会返回一个UserGroupInformation类的实例(以下简称UGI)。如果subject为空,或者这个subject中与org.apache.hadoop.security.User对应的Principal为空,那么说明尚未登录过,调用getLoginUser()创建UserGroupInformation的实例。 getLoginUser()的流程: 1.创建LoginContext: name:如果hadoop.security.authentication等于”kerberos”,那么是“hadoop-user-kerberos”或者“hadoop-keytab-kerberos”,否则是“hadoop-simple”。它的主要作用是作为appName传递给UserGroupInformation.HadoopConfiguration.getAppConfigurationEntry(String appName)方法。 subject: callbackHandler: 空 Configuration: UserGroupInformation.HadoopConfiguration的实例。 2.login.login(); 这个会调用HadoopLoginModule的login()和commit()方法。 HadoopLoginModule的login()方法是一个空函数,只打印了一行调试日志 LOG.debug("hadoop login"); commit()方法负责把Principal添加到Subject中。 此时一个首要问题是username是什么? 在使用了kerberos的情况下,从javax.security.auth.kerberos.KerberosPrincipal的实例获取username。 在未使用kerberos的情况下,优先读取HADOOP_USER_NAME这个系统环境变量,如果不为空,那么拿它作username。否则,读取HADOOP_USER_NAME这个java环境变量。否则,从com.sun.security.auth.NTUserPrincipal或者com.sun.security.auth.UnixPrincipal的实例获取username。 如果以上尝试都失败,那么抛出异常LoginException("Can’t find user name")。 最终拿username构造org.apache.hadoop.security.User的实例添加到Subject中。 测试登录: HADOOP_JAAS_DEBUG=true HADOOP_ROOT_LOGGER=DEBUG,console  bin/hadoop  org.apache.hadoop.security.UserGroupInformation 其中,UGI应该是这样的形式: UGI: host/xx.xx.xx.com@xx.xx.com (auth:KERBEROS)

    01
    领券