Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
Y
yudao-cloud
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
hblj
yudao-cloud
Commits
6f37500f
提交
6f37500f
authored
4月 21, 2020
作者:
YunaiV
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
增加 auth 认证拦截器(未完全)
上级
eec8f086
显示空白字符变更
内嵌
并排
正在显示
14 个修改的文件
包含
200 行增加
和
18 行删除
+200
-18
pom.xml
common/mall-spring-boot-starter-security/pom.xml
+0
-2
CommonSecurityAutoConfiguration.java
...mall/security/config/CommonSecurityAutoConfiguration.java
+24
-2
RequiresLogin.java
.../iocoder/mall/security/core/annotation/RequiresLogin.java
+16
-0
RequiresPermissions.java
...er/mall/security/core/annotation/RequiresPermissions.java
+22
-0
AdminSecurityContext.java
...oder/mall/security/core/context/AdminSecurityContext.java
+28
-0
AdminSecurityContextHolder.java
...all/security/core/context/AdminSecurityContextHolder.java
+30
-0
UserSecurityContext.java
...coder/mall/security/core/context/UserSecurityContext.java
+18
-0
UserSecurityContextHolder.java
...mall/security/core/context/UserSecurityContextHolder.java
+30
-0
AccountAuthInterceptor.java
...all/security/core/interceptor/AccountAuthInterceptor.java
+7
-2
spring.factories
...ter-security/src/main/resources/META-INF/spring.factories
+2
-0
CommonWebAutoConfiguration.java
...n/iocoder/mall/web/config/CommonWebAutoConfiguration.java
+15
-4
UserMVCAutoConfiguration.java
...ocoder/mall/spring/boot/web/UserMVCAutoConfiguration.java
+1
-8
pom.xml
system/system-rest/pom.xml
+5
-0
rpc.yaml
system/system-rpc/src/main/resources/rpc.yaml
+2
-0
没有找到文件。
common/mall-spring-boot-starter-security/pom.xml
浏览文件 @
6f37500f
...
...
@@ -17,7 +17,6 @@
<groupId>
cn.iocoder.mall
</groupId>
<artifactId>
system-rpc-api
</artifactId>
<version>
1.0-SNAPSHOT
</version>
<optional>
true
</optional>
</dependency>
<!-- Spring 核心 -->
...
...
@@ -38,7 +37,6 @@
<dependency>
<groupId>
org.apache.dubbo
</groupId>
<artifactId>
dubbo
</artifactId>
<optional>
true
</optional>
</dependency>
</dependencies>
...
...
common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/config/CommonSecurityAutoConfiguration.java
浏览文件 @
6f37500f
package
cn
.
iocoder
.
mall
.
security
.
config
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnClass
;
import
cn.iocoder.mall.security.core.interceptor.AccountAuthInterceptor
;
import
cn.iocoder.mall.web.config.CommonWebAutoConfiguration
;
import
cn.iocoder.mall.web.core.constant.CommonMallConstants
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.boot.autoconfigure.AutoConfigureAfter
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.web.servlet.config.annotation.InterceptorRegistry
;
import
org.springframework.web.servlet.config.annotation.WebMvcConfigurer
;
@Configuration
@AutoConfigureAfter
(
CommonWebAutoConfiguration
.
class
)
// 在 CommonWebAutoConfiguration 之后自动配置,保证过滤器的顺序
@ConditionalOnWebApplication
(
type
=
ConditionalOnWebApplication
.
Type
.
SERVLET
)
@ConditionalOnClass
(
name
=
{
"cn.iocoder.mall.system.rpc.api.systemlog.SystemLogRPC"
,
"org.apache.dubbo.config.annotation.Reference"
})
public
class
CommonSecurityAutoConfiguration
implements
WebMvcConfigurer
{
private
Logger
logger
=
LoggerFactory
.
getLogger
(
getClass
());
// ========== 拦截器相关 ==========
@Bean
@ConditionalOnMissingBean
(
AccountAuthInterceptor
.
class
)
public
AccountAuthInterceptor
accountAuthInterceptor
()
{
return
new
AccountAuthInterceptor
();
}
@Override
public
void
addInterceptors
(
InterceptorRegistry
registry
)
{
// AccountAuthInterceptor 拦截器
registry
.
addInterceptor
(
this
.
accountAuthInterceptor
())
.
addPathPatterns
(
CommonMallConstants
.
ROOT_PATH_ADMIN
+
"/**"
,
CommonMallConstants
.
ROOT_PATH_USER
+
"/**"
);
logger
.
info
(
"[addInterceptors][加载 AccountAuthInterceptor 拦截器完成]"
);
}
}
common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/annotation/RequiresLogin.java
0 → 100644
浏览文件 @
6f37500f
package
cn
.
iocoder
.
mall
.
security
.
core
.
annotation
;
import
java.lang.annotation.*
;
/**
* 要求用户登录注解。通过将该注解添加到 Controller 上,会自动校验用户是否登陆。
*
* 默认请求下,用户访问的 API 接口,无需登陆。主要的考虑是,
* 1. 需要用户登陆的接口,本身会获取在线用户的编号。如果不添加 @RequiresLogin 注解就会报错。
* 2. 大多数情况下,用户的 API 接口无需登陆。
*/
@Documented
@Target
({
ElementType
.
METHOD
})
// 暂时不支持 ElementType.TYPE ,因为没有场景
@Retention
(
RetentionPolicy
.
RUNTIME
)
public
@interface
RequiresLogin
{
}
common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/annotation/RequiresPermissions.java
0 → 100644
浏览文件 @
6f37500f
package
cn
.
iocoder
.
mall
.
security
.
core
.
annotation
;
import
java.lang.annotation.*
;
/**
* 参考 Shiro @RequiresPermissions 设计 http://shiro.apache.org/static/1.3.2/apidocs/org/apache/shiro/authz/annotation/RequiresPermissions.html
*
* 通过将该注解添加到 Controller 的方法上,进行授权鉴定
*/
@Documented
@Target
({
ElementType
.
METHOD
})
// 暂时不支持 ElementType.TYPE ,因为没有场景
@Retention
(
RetentionPolicy
.
RUNTIME
)
public
@interface
RequiresPermissions
{
/**
* 当有多个标识时,必须全部拥有权限,才可以操作
*
* @return 权限标识数组
*/
String
[]
value
();
}
common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/context/AdminSecurityContext.java
0 → 100644
浏览文件 @
6f37500f
package
cn
.
iocoder
.
mall
.
security
.
core
.
context
;
import
lombok.Data
;
import
lombok.experimental.Accessors
;
import
java.util.Set
;
/**
* Security 上下文
*/
@Data
@Accessors
(
chain
=
true
)
public
class
AdminSecurityContext
{
/**
* 管理员编号
*/
private
Integer
adminId
;
/**
* 管理员账号
*/
private
String
username
;
/**
* 拥有的角色编号
*/
private
Set
<
Integer
>
roleIds
;
}
common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/context/AdminSecurityContextHolder.java
0 → 100644
浏览文件 @
6f37500f
package
cn
.
iocoder
.
mall
.
security
.
core
.
context
;
/**
* {@link AdminSecurityContext} Holder
*
* 参考 spring security 的 ThreadLocalSecurityContextHolderStrategy 类,简单实现。
*/
public
class
AdminSecurityContextHolder
{
private
static
final
ThreadLocal
<
AdminSecurityContext
>
SECURITY_CONTEXT
=
new
ThreadLocal
<>();
public
static
void
setContext
(
AdminSecurityContext
context
)
{
SECURITY_CONTEXT
.
set
(
context
);
}
public
static
AdminSecurityContext
getContext
()
{
AdminSecurityContext
ctx
=
SECURITY_CONTEXT
.
get
();
// 为空时,设置一个空的进去
if
(
ctx
==
null
)
{
ctx
=
new
AdminSecurityContext
();
SECURITY_CONTEXT
.
set
(
ctx
);
}
return
ctx
;
}
public
static
void
clear
()
{
SECURITY_CONTEXT
.
remove
();
}
}
common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/context/UserSecurityContext.java
0 → 100644
浏览文件 @
6f37500f
package
cn
.
iocoder
.
mall
.
security
.
core
.
context
;
import
lombok.Data
;
import
lombok.experimental.Accessors
;
/**
* User Security 上下文
*/
@Data
@Accessors
(
chain
=
true
)
public
class
UserSecurityContext
{
/**
* 用户编号
*/
private
Integer
userId
;
}
common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/context/UserSecurityContextHolder.java
0 → 100644
浏览文件 @
6f37500f
package
cn
.
iocoder
.
mall
.
security
.
core
.
context
;
/**
* {@link UserSecurityContext} Holder
*
* 参考 spring security 的 ThreadLocalSecurityContextHolderStrategy 类,简单实现。
*/
public
class
UserSecurityContextHolder
{
private
static
final
ThreadLocal
<
UserSecurityContext
>
SECURITY_CONTEXT
=
new
ThreadLocal
<
UserSecurityContext
>();
public
static
void
setContext
(
UserSecurityContext
context
)
{
SECURITY_CONTEXT
.
set
(
context
);
}
public
static
UserSecurityContext
getContext
()
{
UserSecurityContext
ctx
=
SECURITY_CONTEXT
.
get
();
// 为空时,设置一个空的进去
if
(
ctx
==
null
)
{
ctx
=
new
UserSecurityContext
();
SECURITY_CONTEXT
.
set
(
ctx
);
}
return
ctx
;
}
public
static
void
clear
()
{
SECURITY_CONTEXT
.
remove
();
}
}
common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/
account
/AccountAuthInterceptor.java
→
common/mall-spring-boot-starter-security/src/main/java/cn/iocoder/mall/security/core/
interceptor
/AccountAuthInterceptor.java
浏览文件 @
6f37500f
package
cn
.
iocoder
.
mall
.
security
.
core
.
account
;
package
cn
.
iocoder
.
mall
.
security
.
core
.
interceptor
;
import
cn.iocoder.common.framework.util.HttpUtil
;
import
cn.iocoder.common.framework.util.ServiceExceptionUtil
;
...
...
@@ -10,6 +10,7 @@ import cn.iocoder.mall.web.core.util.CommonWebUtil;
import
org.apache.dubbo.config.annotation.Reference
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.util.StringUtils
;
import
org.springframework.web.servlet.handler.HandlerInterceptorAdapter
;
import
javax.servlet.http.HttpServletRequest
;
...
...
@@ -24,8 +25,12 @@ public class AccountAuthInterceptor extends HandlerInterceptorAdapter {
@Override
public
boolean
preHandle
(
HttpServletRequest
request
,
HttpServletResponse
response
,
Object
handler
)
{
//
执行认证
//
获得访问令牌
String
accessToken
=
HttpUtil
.
obtainAuthorization
(
request
);
if
(
StringUtils
.
hasText
(
accessToken
))
{
// 如果未传递,则不进行认证
return
true
;
}
// 执行认证
OAuth2AccessTokenAuthenticateRequest
oauth2AccessTokenAuthenticateRequest
=
new
OAuth2AccessTokenAuthenticateRequest
()
.
setAccessToken
(
accessToken
).
setIp
(
HttpUtil
.
getIp
(
request
));
CommonResult
<
OAuth2AccessTokenResponse
>
oauth2AccessTokenResponseResult
=
oauth2RPC
.
authenticate
(
oauth2AccessTokenAuthenticateRequest
);
...
...
common/mall-spring-boot-starter-security/src/main/resources/META-INF/spring.factories
0 → 100644
浏览文件 @
6f37500f
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.iocoder.mall.security.config.CommonSecurityAutoConfiguration
common/mall-spring-boot-starter-web/src/main/java/cn/iocoder/mall/web/config/CommonWebAutoConfiguration.java
浏览文件 @
6f37500f
package
cn
.
iocoder
.
mall
.
web
.
config
;
import
cn.iocoder.common.framework.servlet.CorsFilter
;
import
cn.iocoder.mall.web.core.constant.CommonMallConstants
;
import
cn.iocoder.mall.web.core.handler.GlobalExceptionHandler
;
import
cn.iocoder.mall.web.core.handler.GlobalResponseBodyHandler
;
...
...
@@ -10,6 +11,7 @@ import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnClass
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication
;
import
org.springframework.boot.web.servlet.FilterRegistrationBean
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.web.servlet.config.annotation.InterceptorRegistry
;
...
...
@@ -47,14 +49,23 @@ public class CommonWebAutoConfiguration implements WebMvcConfigurer {
@Override
public
void
addInterceptors
(
InterceptorRegistry
registry
)
{
try
{
AccessLogInterceptor
accessLogInterceptor
=
this
.
accessLogInterceptor
();
if
(
accessLogInterceptor
!=
null
)
{
registry
.
addInterceptor
(
accessLogInterceptor
)
registry
.
addInterceptor
(
this
.
accessLogInterceptor
())
.
addPathPatterns
(
CommonMallConstants
.
ROOT_PATH_ADMIN
+
"/**"
,
CommonMallConstants
.
ROOT_PATH_USER
+
"/**"
);
}
logger
.
info
(
"[addInterceptors][加载 AccessLogInterceptor 拦截器完成]"
);
}
catch
(
NoSuchBeanDefinitionException
e
)
{
logger
.
warn
(
"[addInterceptors][无法获取 AccessLogInterceptor 拦截器,因此不启动 AccessLog 的记录]"
);
}
}
// ========== 过滤器相关 ==========
@Bean
@ConditionalOnMissingBean
public
FilterRegistrationBean
<
CorsFilter
>
corsFilter
()
{
FilterRegistrationBean
<
CorsFilter
>
registrationBean
=
new
FilterRegistrationBean
<>();
registrationBean
.
setFilter
(
new
CorsFilter
());
registrationBean
.
addUrlPatterns
(
"/*"
);
return
registrationBean
;
}
}
common/mall-spring-boot/src/main/java/cn/iocoder/mall/spring/boot/web/UserMVCAutoConfiguration.java
浏览文件 @
6f37500f
...
...
@@ -53,13 +53,6 @@ public class UserMVCAutoConfiguration implements WebMvcConfigurer {
registry
.
addInterceptor
(
userSecurityInterceptor
()).
addPathPatterns
(
MallConstants
.
ROOT_PATH_USER
+
"/**"
);
}
@Bean
@ConditionalOnMissingBean
public
FilterRegistrationBean
<
CorsFilter
>
corsFilter
()
{
FilterRegistrationBean
<
CorsFilter
>
registrationBean
=
new
FilterRegistrationBean
<>();
registrationBean
.
setFilter
(
new
CorsFilter
());
registrationBean
.
addUrlPatterns
(
"/*"
);
return
registrationBean
;
}
}
system/system-rest/pom.xml
浏览文件 @
6f37500f
...
...
@@ -26,6 +26,11 @@
<artifactId>
mall-spring-boot-starter-web
</artifactId>
<version>
1.0-SNAPSHOT
</version>
</dependency>
<dependency>
<groupId>
cn.iocoder.mall
</groupId>
<artifactId>
mall-spring-boot-starter-security
</artifactId>
<version>
1.0-SNAPSHOT
</version>
</dependency>
<dependency>
<groupId>
cn.iocoder.mall
</groupId>
<artifactId>
mall-spring-boot-starter-swagger
</artifactId>
...
...
system/system-rpc/src/main/resources/rpc.yaml
浏览文件 @
6f37500f
...
...
@@ -21,3 +21,5 @@ dubbo:
consumer
:
SystemLogRPC
:
# 用于 AccessLogInterceptor 等拦截器,记录 HTTP API 请求的访问日志
version
:
1.0.0
OAuth2RPC
:
version
:
1.0.0
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论