spring-security-oauth2(二十五) Spring Security授权简介

授权概念

权限系统通常要解决认证和授权

  • 认证,即在应用中谁能证明他就是他本人。一般提供如他们的身份ID一些标识信息来表明他就是他本人,如提供身份证,用户名/密码来证明。
  • 授权,也叫访问控制,即在应用中控制谁能访问哪些资源(如访问页面/编辑数据/页面操作等)。

前面我们分析的都是认证,即你是谁问题?

这篇我们来分析你能做什么的问题。

授权分析

spring-security-oauth2(二十五) Spring Security授权简介

权限是某个资源能否杯用户访问,而并不是能否显示的问题。

权限场景

通常公司的系统分对外系统 权限场景比较简单,而内部管理系统权限场景比较复杂(业务及需求经常变动)

spring-security-oauth2(二十五) Spring Security授权简介

spring-security-oauth2(二十五) Spring Security授权简介 

权限控制

权限控制是基于用户-角色-权限这套体系,这个我么后面详细介绍。其实我们前面的浏览器项目已经有权限控制了我们再来看下

com.rui.tiger.auth.browser.config.BrowserSecurityConfig#configure

/**
	 * 核心配置
	 * @param http
	 * @throws Exception
	 */
	@Override
	protected void configure(HttpSecurity http) throws Exception {
		/**
		 * 表单密码配置
		 */
		applyPasswordAuthenticationConfig(http);
		http
				.apply(captchaSecurityConfig)
					.and()
				.apply(smsAuthenticationSecurityConfig)
					.and()
				.apply(tigerSpringSocialConfigurer)
					.and()
				.rememberMe()
				.tokenRepository(persistentTokenRepository())
				.tokenValiditySeconds(securityProperties.getBrowser().getRemberMeSeconds())
				.userDetailsService(userDetailsService)
					.and()
				.sessionManagement()
				.invalidSessionStrategy(invalidSessionStrategy)//session失效策略
				.maximumSessions(securityProperties.getBrowser().getSession().getMaximumSessions())//最大session并发数
				.maxSessionsPreventsLogin(securityProperties.getBrowser().getSession().isMaxSessionsPreventsLogin())//true达到并发数后阻止登录,false 踢掉之前的登录
				.expiredSessionStrategy(sessionInformationExpiredStrategy)//并发策略
				.and()
				.and()
				.logout()
				.logoutUrl("/loginOut") //默认logout
				//.logoutSuccessUrl("") url和Handler只能配置一个
				.logoutSuccessHandler(tigerLogoutSuccessHandler)
				.deleteCookies("JSESSIONID")//清楚cook键值
				.and()
				.authorizeRequests()
				.antMatchers(
						SecurityConstants.DEFAULT_UNAUTHENTICATION_URL,//权限认证
						SecurityConstants.DEFAULT_LOGIN_PROCESSING_URL_MOBILE,//手机
						securityProperties.getBrowser().getLoginPage(),//登录页面
						SecurityConstants.DEFAULT_VALIDATE_CODE_URL_PREFIX+"/*",//  /captcha/* 验证码放行
						securityProperties.getBrowser().getSignupUrl(),
						//这个第三方自定义权限 后续抽离出去 可配置
						securityProperties.getBrowser().getLoginOut(),
						"/user/regist",
						"/index.html",
						securityProperties.getBrowser().getSession().getInvalidSessionUrl())
				.permitAll()
				//底层会拼接ROLE_ADMIN
				.antMatchers("/user").hasRole("ADMIN")
				//restful风格匹配
				.antMatchers(HttpMethod.GET, "/user/*").hasRole("USER")
				.anyRequest()
				.authenticated()
					.and()
				.csrf().disable();

	}

用户服务

这里只是模拟,通常用户的账号密码及相关权限信息,都是配置在数据中的。

  private SocialUserDetails buildUser(String userId) {
        // 根据用户名查找用户信息
        //根据查找到的用户信息判断用户是否被冻结
        String password = passwordEncoder.encode("123456");
        log.info("数据库密码是:" + password);
        return new SocialUser(
                userId,
                password,
                true,
                true,
                true,
                true,
                AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_ADMIN,ROLE_USER")
        );
    }