java开源项目jeecg结构与代码全解析( 二 )


if (local_createBy == null || local_createBy.equals("")) {
if (sysUser != null) {
// 登录人账号
field.setAccessible(true);
field.set(parameter, sysUser.getUsername());
field.setAccessible(false);
}
}
}
}
2.MybatisPlusSaasConfig
该类主要负责多租户 , 什么是多租户呢?
多租户:就是多个公司/客户公用一套系统/数据库 , 这就需要保证数据的权限 。
该场景比较少不详细说明 。
2.oss
主要从application-dev.yml获取到上传的路径与配置 。
3.shiro
安全框架主要有两个目标:认证与鉴权 。
认证:判断用户名密码是否正确 。
鉴权:判断用户是否有权限访问该接口 。
这里本文着重讲解 , 如果遇到shiro相关应用 , 可以项目直接移植使用 。
1.CustomShiroFilterFactoryBean
该类主要负责解决资源中文路径问题 。这里有个通用的解决方式 。
新建类集成ShiroFilterFactoryBean方法 , 并重写核心方法createInstance() , 并在注入时 , 注入新建的类
CustomShiroFilterFactoryBean , 这样就达到的以往重新源码的功能 。因为spring提供的功能都是用该思想 , 所以修改源码的地方就原来越少了 , 都可以使用该方式实现 。
2.JwtFilter
同上文 , 复写
BasicHttpAuthenticationFilter的验证登录用户的方法 , 在执行登录接口后判断用户是否正确 。
3.ResourceCheckFilter
负责鉴权使用 , 判断当前用户是否有权限访问 。
//表示是否允许访问  , 如果允许访问返回true , 否则false;
@Override
protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) throws Exception {
Subject subject = getSubject(servletRequest, servletResponse);
//获取当前url
String url = getPathWithinApplication(servletRequest);
log.info("当前用户正在访问的 url => " + url);
return subject.isPermitted(url);
}
//onAccessDenied:表示当访问拒绝时是否已经处理了; 如果返回 true 表示需要继续处理; 如果返回 false
@Override
protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
response.sendRedirect(request.getContextPath() + this.errorUrl);
// 返回 false 表示已经处理 , 例如页面跳转啥的 , 表示不在走以下的拦截器了(如果还有配置的话)
return false;
}
4.ShiroRealm
主要负责获取用户所有的菜单权限 , 并提供token的一系列方法 。
//获取所有菜单权限集合
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
}
//验证用户输入的账号和密码是否正确
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken auth) throws AuthenticationException {
}
//校验token的有效性
public LoginUser checkUserTokenIsEffect(String token) throws AuthenticationException {
}
//刷新token有效时间
public boolean jwtTokenRefresh(String token, String userName, String password) {
}
//清除当前用户的权限认证缓存
@Override
public void clearCache(PrincipalCollection principals) {
super.clearCache(principals);
}
5.ShiroConfig
此为shiro的核心配置类 , 大多数写法都是固定写法 。
public class ShiroConfig {
@Value("${jeecg.shiro.excludeUrls}")
private String excludeUrls;
@Resource
LettuceConnectionFactory lettuceConnectionFactory;
@Autowired
private Environment env;
@Bean("shiroFilter")
public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
CustomShiroFilterFactoryBean shiroFilterFactoryBean = new CustomShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager);
// 拦截器
Map<string, string=""> filterChainDefinitionMap = new linkedHashMap<string, string="">();
if(oConvertUtils.isNotEmpty(excludeUrls)){
String[] permissionUrl = excludeUrls.split(",");
for(String url : permissionUrl){
filterChainDefinitionMap.put(url,"anon");
}
}
// 配置不会被拦截的链接 顺序判断 也就是不同通过token访问的地址
filterChainDefinitionMap.put("/sys/cas/client/validateLogin", "anon"); /


推荐阅读