Skip to content
On this page

用户鉴权

基本介绍

鉴权(authentication)是指验证用户是否拥有访问系统的权利。

本框架中接口的鉴权有两种方式,一种是注解鉴权,一种是路由拦截。

注解鉴权

注解鉴权 —— 优雅的将鉴权与业务代码分离!详细文档

java
- @SaCheckLogin: 登录校验 —— 只有登录之后才能进入该方法。
- @SaCheckRole("admin"): 角色校验 —— 必须具有指定角色标识才能进入该方法。
- @SaCheckPermission("user:add"): 权限校验 —— 必须具有指定权限才能进入该方法。
- @SaCheckSafe: 二级认证校验 —— 必须二级认证之后才能进入该方法。
- @SaCheckBasic: HttpBasic 校验 —— 只有通过 Basic 认证后才能进入该方法。
- @SaIgnore:忽略校验 —— 表示被修饰的方法或类无需进行注解鉴权和路由拦截器鉴权。
- @SaCheckDisable("comment"):账号服务封禁校验 —— 校验当前账号指定服务是否被封禁。

拦截器鉴权

拦截器鉴权 —— 全局统一配置! 详细文档

java
/**
	 * 无需登录的接口地址集合
	 */
	private static final String[] NO_LOGIN_PATH_ARR = {
			/* 主入口 */
			"/",

			/* 静态资源 */
			"/favicon.ico", "/doc.html", "/webjars/**", "/swagger-resources/**", "/v2/api-docs", "/v2/api-docs-ext",
			"/configuration/ui", "/configuration/security", "/ureport/**", "/druid/**", "/**/js/**", "/**/css/**",
			"/**/plugins/**", "/**/images/**",

			/* 认证相关 */
			"/sso/userinfo", "/sso/auth", "/sso/doLogin", "/sso/checkTicket", "/sso/login", "/sso/signout",
			"/sso/logout", "/sso/logoutCall", "/sso/org/change", "/**/login", "/oauth2/**",

			/* 其他 */
			"/error", "/actuator/**", "/test/**"

	};

	/**
	 * 仅超管使用的接口地址集合
	 */
	private static final String[] SUPER_PERMISSION_PATH_ARR = {

	};

	/**
	 * B端要排除的
	 */
	private static final String[] EXCLUDE_PERMISSION_PATH_ARR = {};

	/**
	 * 注册跨域过滤器
	 */
	@Bean
	public SaServletFilter getSaServletFilter() {
		return new SaServletFilter()
			// 指定拦截路由
			.addInclude("/**")

			// 设置鉴权的接口
			.setAuth(r -> {
				// B端的接口校验B端登录
				SaRouter.match("/**")
					// 排除无需登录接口
					.notMatch(CollectionUtil.newArrayList(NO_LOGIN_PATH_ARR))
					// 排除接口
					.notMatch(CollectionUtil.newArrayList(EXCLUDE_PERMISSION_PATH_ARR))
					// 校验B端登录
					.check(r1 -> StpUtil.checkLogin());

				// B端的超管接口校验B端超管角色
				SaRouter.match("/**")
					// 排除无需登录接口
					.notMatch(CollectionUtil.newArrayList(NO_LOGIN_PATH_ARR))
					// 匹配超管接口
					.match(CollectionUtil.newArrayList(SUPER_PERMISSION_PATH_ARR))
					// 校验B端超管角色 超级管理元角色为1
					.check(r1 -> StpUtil.checkRole("1"));
			})

			// 异常处理
			.setError(e -> {
				// 由于过滤器中抛出的异常不进入全局异常处理,所以必须提供[异常处理函数]来处理[认证函数]里抛出的异常
				// 在[异常处理函数]里的返回值,将作为字符串输出到前端,此处统一转为JSON输出前端
				SaResponse saResponse = SaHolder.getResponse();
				saResponse.setHeader(Header.CONTENT_TYPE.getValue(),
						ContentType.JSON + ";charset=" + CharsetUtil.UTF_8);
				return GlobalExceptionUtil.getCommonResult((Exception) e);
			});
	}