spring security 入门

之前没做过什么权限认证,这次做的项目是基于spring MVC的,在权限这块用的了Spring Security,下面与大家分享下我在这次项目中,security这方面的使用经验。

Spring Security主要依赖于Spring Framework来实现权限管理,其核心功能主要用于支持Web Application,所以Spring Security实际上是一堆Filter链构成的权限验证体系。

实现权限管理主要有几个要点:

  1. 解决用户登录登出系统问题
  2. 解决用户访问受限资源的问题(登录验证-Authentication、资源认证-Authorization)
  3. 解决用户、权限、资源、数据四者之间的逻辑关系

从Spring Security这个框架本身来看,它可以帮助解决前2个问题,对于第3个问题,它只有基本流程控制,并无具体实现。所以,完成权限的核心,是设计第3个问题所涉及到的4个不同的维度。

  • 用户 / 权限 / 资源

用户、权限和资源是所有权限系统的3个核心概念,三者之间依次形成多对多的关系。

用户:至少包含username、password等需要进行登录验证-Authentication的必要字段。在Spring Security中,用户模型有默认的实现:UserDetails和User。前者是接口,后者是实现类。一般情况下,这两个默认实现都不够用,因为通常一个J2EE应用的用户体系要包含很多业务相关的字段,所以我们会尽可能实现自己的User模型:

public interface SecurityUserDetails extends UserDetails {

    public boolean hasAnyPrincipalRole(String... roles);

    public boolean hasResource(String type, String key);

}

权限:通常用一个字符串来表示(ROLE_USER / ROLE_ADMIN),实际表示一个用户的角色标识。例如,我们可以将ROLE_USER权限赋予一个用户。这样一来,就可以根据用户的角色来进行一些逻辑判断(当某个用户是某个权限时,它是否可以做某些事情)。在Spring Security的配置文件中,我们看到的最多的其实就是根据权限来判断,例如:

<intercept-url pattern="/**" access="hasAnyRole('ROLE_WEIXIN', 'ROLE_ADMIN')" />

资源:通常表示权限系统中可以访问的内容。例如,URL,Menu,甚至一个button都可以是一个资源,所以通常资源可以根据不同的类型进行划分。资源是最细粒度的权限控制单位。具体来说,根据用户是否能够访问某个资源来进行权限的逻辑判断。综合这种数据结构,资源通常被设计成一个Map的结构,其中key就是资源的类型,而value就是资源的标识:

"menus": ["menu-account", "menu-stat", "menu-system"],
"submenus": [ "submenu-account-management", "submenu-account-list", "submenu-account-create", "submenu-user-management", "submenu-user-admin", "submenu-user-weixin", "submenu-stat", "submenu-login-session", "submenu-site-stat","submenu-system-person", "submenu-personal","submenu-system-config", "submenu-global-settings"],
"urls": ["accounts"]
  • Authentication / Authorization

Authentication是指”登录验证“,是权限验证的第一层门栓。当一个用户登录之后,用户的登录信息会被保存在Session中,并通过线程安全的ThreadLocal进行读取。这个登录信息在Spring Security中,用Authentication接口来表示:

public interface Authentication extends Principal, Serializable {

    Collection<? extends GrantedAuthority> getAuthorities();

    Object getCredentials();

    Object getDetails();

    Object getPrincipal();

    boolean isAuthenticated();

    void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException;
}

当我们使用编程接口来获得当前的登录用户信息时,Authentication是绕不开的一个接口:

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
User user = (User) authentication.getPrincipal();

在JSP中,principal实际上就对应于Authentication中的getter方法:

<sec:authentication property="principal" var="currentPrincipal" scope="page" />

Authorization指的是”资源认证“,表示是否能够访问某个资源的判断逻辑。在Spring Security中,Authorization主要是基于权限判定来完成的:

<intercept-url pattern="/**" access="hasAnyRole('ROLE_WEIXIN', 'ROLE_ADMIN')" />
<sec:authorize access="isFullyAuthenticated()">
    <%@ include file="/WEB-INF/include/welcome.jsp" %>  
</sec:authorize>
在实际项目中,光有权限判定往往是不够的,需要加入基于资源的判定。这个在默认的Spring Security中并无支持,需要进行额外扩展,这个在下次给他们分享。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值