# 安全框架

jweb提供一套自己的安全框架jweb-security,系统参考shiro实现。简化web安全认证与权限授权操作.易懂且可定制. 其中核心为session实现,默认包含HttpSessionJwtSession实现

jweb包含两个子模块:

  1. 登录认证模块
  2. 权限鉴权模块

# 配置文件

#--------jweb 安全模块配置 start--------
# 安全模块总开关,默认false
jweb.security.enable=true
# session超时时长(秒),默认30*60秒,即30分钟
jweb.security.sessionTimeout=10
# session类型:DEFAULT:http session,JWT:json web token session。{className}:自定义session实现类名
jweb.security.sessionType=JWT
# 也可以直接写实现类
# jweb.security.sessionType=cc.jweb.boot.security.session.impl.JwebHttpSession

# jwt token 生成密钥,base64编码,必填
jweb.security.jwt.secret=MTIz
# jwt token 存储keyName,默认为jwt
jweb.security.jwt.storeKey=jwtt
# jwt token 存储位置,可选:HEADER,COOKIE, 默认为cookie
jweb.security.jwt.storePosition=COOKIE


# jweb 登录模块配置 start--------
# 是否启用,默认true
jweb.security.authc.enable=true
# 配置未认证时,自动跳转登录地址,该地址不会被安全框架拦截。(注:一般也是登录表单提交的地址)。
jweb.security.authc.loginUrl=/login
# 需要认证登录的地址列表,多个地址用,隔开,采用AntPathMatch路径匹配规则
# Apache Ant样式的路径有三种通配符匹配方法。
#
#    ‘?’  匹配任何单字符
#    ‘*’  匹配0或者任意数量的字符
#    ‘**’ 匹配0或者更多的目录
#    /app/*.x      匹配(Matches)所有在app路径下的.x文件
#    /app/p?ttern  匹配(Matches) /app/pattern 和 /app/pXttern,但是不包括/app/pttern
#    /**/example   匹配(Matches) /app/example, /app/foo/example, 和 /example
#    /app/**/dir/file.  匹配(Matches) /app/dir/file.jsp, /app/foo/dir/file.html, /app/foo/bar/dir/file.pdf
#    /**/*.jsp     匹配(Matches)任何的.jsp 文件
jweb.security.authc.filtePaths=/**
# 排除不需要认证的地址列表,多个地址用隔开,采用AntPathMatch路径匹配规则
jweb.security.authc.excludePaths=/assets/**,/vcode,/401,/403,/file/**,/portal/**
# jweb 登录模块配置 end--------

# jweb 权限鉴权模块配置 start--------
# 是否启用,默认true
jweb.security.perms.enable=true
# 权限校验失败时,重定向地址
jweb.security.perms.failureUrl=/403
# 权限管理器(单例),管理权限校验接口,默认: JwebNonePermsManager,权限判定永远返回false,需要重写
# jweb.security.perms.manager=cc.jweb.boot.security.session.perms.JwebNonePermsManager

# jweb 登录模块配置 end--------

#--------jweb 安全模块配置 end--------
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

# 全局配置

配置项 默认值 是否必须 备注
jweb.security.enable false 安全框架总开关,通过配置true或者false来开启或者关闭
jweb.security.sessionTimeout 1800 session超时时长(秒),默认30*60秒,即30分钟
jweb.security.sessionType DEFAULT session类型:DEFAULT:http session,JWT:json web token session。{className}:自定义session实现类名

Session类型

  • DEFAULT:httpSession类型
  • JWT: json web token session 类型
配置项 默认值 是否必须 备注
jweb.security.jwt.secret null jwt token 生成密钥,需是base64编码字符,必填
jweb.security.jwt.storeKey jwt jwt token 存储keyName,默认为jwt
jweb.security.jwt.storePosition COOKIE jwt token 响应存储位置,可选:HEADER,COOKIE, 默认为COOKIE

注意

当jweb.security.jwt.storePosition = HEADER 时,浏览器不会记录HEADER,需要前端自行完成存储与提交Header信息

  • {className}: 自定义session类型,这是自定义session的入口

# 登录认证模块

提供系统登录认证的功能,可以快速开发登录认证功能模块

配置项 默认值 是否必须 备注
jweb.security.authc.enable true 登录认证开关,通过配置true或者false来开启或者关闭。
jweb.security.authc.loginUrl /login 配置未认证时,自动跳转登录地址,该地址不会被安全框架拦截。(注:一般也是登录表单提交的地址)
jweb.security.authc.filtePaths /** 要认证登录的地址列表,多个地址用,隔开,采用AntPathMatch路径匹配规则
jweb.security.authc.excludePaths null 排除不需要认证的地址列表,多个地址用隔开,采用AntPathMatch路径匹配规则,通常用于排查静态资源文件
# Apache Ant样式的路径有三种通配符匹配方法。
#
#    ‘?’  匹配任何单字符
#    ‘*’  匹配0或者任意数量的字符
#    ‘**’ 匹配0或者更多的目录
#    /app/*.x      匹配(Matches)所有在app路径下的.x文件
#    /app/p?ttern  匹配(Matches) /app/pattern 和 /app/pXttern,但是不包括/app/pttern
#    /**/example   匹配(Matches) /app/example, /app/foo/example, 和 /example
#    /app/**/dir/file.  匹配(Matches) /app/dir/file.jsp, /app/foo/dir/file.html, /app/foo/bar/dir/file.pdf
#    /**/*.jsp     匹配(Matches)任何的.jsp 文件
1
2
3
4
5
6
7
8
9
10

认证Sesion代码
通过JwebSecurityUtils.setAccount(),设置Account信息,session就被标志为已认证。参考示例:

@ActionKey("/login")
public void login() {
    // 处理用户登录操作,验证成功后,设置账户信息
    String uid = getPara("uid");
    String uname = getPara("uname");
    if (uid != null) {
        JwebSecurityUtils.setAccount(new JwebSecurityAccount(uid, uname));
    }
    if (JwebSecurityUtils.isAuthentication()) {
        renderText("登录成功!" + JwebSecurityUtils.getAccount());
    } else {
        renderHtml("<a href='/login?uid=2&uname=测试用户' >登录</a>");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

注销Sesion代码
通过JwebSecurityUtils.invalidate()注销session。参考示例:

@ClearSecurity
@ActionKey("/logout")
public void logout() {
    JwebSecurityUtils.invalidate();
    redirect("/login");
}
1
2
3
4
5
6

# 权限鉴权模块

提供系统登录认证的功能,可以快速开发权限鉴权功能模块

配置项 默认值 是否必须 备注
jweb.security.perms.enable true 权限校验开关,通过配置true或者false来开启或者关闭。
jweb.security.perms.failureUrl /403 权限校验失败时,重定向地址
jweb.security.perms.manager JwebNonePermsManager 权限管理器(单例),管理权限校验接口,默认: JwebNonePermsManager,权限判定永远返回false,需要重写]

# 注解配置

jweb提供权限注解配置方法,提供以下几个注解:

  1. @RequiresAuthentication:表示要求认证,可注解在Controller类上或者方法上。
  2. @RequiresPermissions:表示要求权限,可注解在Controller类上或者方法上。
  3. @RequiresRoles:表示要求拥有角色,可注解在Controller类上或者方法上。
  4. @ClearSecurity:表示清除所有安全配置,不用认证与鉴权,可注解在Controller类上或者方法上。

如果Controller类或者方法配置多个注解信息,检查顺序为:@RequiresAuthentication -> @RequiresRoles -> @RequiresPermissions

注解代码示例

@RequiresPermissions("filemgr:file:view")
@RequestMapping(value = "/file", viewPath = "/WEB-INF/views/file/")
public class SysFileController extends JwebController {

    @RequiresPermissions("filemgr:file:list")
    public void list() {
        ...
    }
    // 权限OR关系,支持AND与OR, 默认AND
    @RequiresPermissions(value = {"filemgr:file:add","filemgr:file:edit"}, logical = Logical.OR)
    public void save() {
        ...
    }
    @RequiresRoles("admin")
    @RequiresPermissions("filemgr:file:del")
    public void delete() {
        ...
    }

    // 无需要权限即可访问
    @ClearSecurity
    public void fileCount(){
        ...
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

# 模板指令

在模板渲染引擎上,jweb新增了权限模板指令,有以下几个:

  1. #jwebAccount 获取账户对象指令,示例:
#jwebAccount()
    #(account)
#end
1
2
3
  1. #jwebAuthenticated 用户已经身份验证通过,示例:
#jwebAuthenticated()
     body
#end
1
2
3
  1. #jwebUnAuthenticated 用户未登录,示例:
#jwebUnAuthenticated()
     body
#end
1
2
3
  1. #jwebGuest 游客访问时。用户登录成功则不显示,示例:
#jwebGuest()
    body
#end
1
2
3
  1. #jwebHasRole(roleName) 有相应角色时显示,示例:
#jwebHasRole(roleName)
    body
#end
1
2
3
  1. #jwebHasAnyRoles(roleName1,roleName2,...) 拥有任何一个角色,示例:
#jwebHasAnyRoles(roleName1,roleName2,...)
    body
#end
1
2
3
  1. #jwebHasAllRoles(roleName1,roleName2,...) 拥有全部角色,示例:
#jwebHasAllRoles(roleName1,roleName2,...)
    body
#end
1
2
3
  1. #jwebNotHasRole(roleName) 拥有全部角色,示例:
#jwebNotHasRole(roleName)
    body
#end
1
2
3
  1. #jwebHasPermission(permissionName) 有相应权限,示例:
#jwebHasPermission(permissionName)
    body
#end
1
2
3
  1. #jwebHasAnyPermission(permission1,permission2,...) 拥有任何一个权限,示例:
#jwebHasAnyPermission(permission1,permission2,...)
    body
#end
1
2
3
  1. #jwebHasAllPermission(permission1,permission2,...) 拥有全部权限,示例:
#jwebHasAllPermission(permission1,permission2,...)
    body
#end
1
2
3
  1. #jwebNotHasPermission(permissionName) 拥有全部权限,示例:
#jwebNotHasPermission(permissionName)
    body
#end
1
2
3