一. 总思路
1. 需求:不同项目组有不同的开发人员,为了仓库的安全管理,需要为项目不同的仓库,并且将仓库的部署、修改和删除权限赋给该项目组的成员,其他用户只能读、下载和搜索该仓库的内容
2. 假设:一个新项目foo有独立的项目组成员、独立仓库,只有项目组成员才有权限部署仓库
3. 总体思路(从下到上)
(1) 仓库
(2) 仓库目标
(3) 权限
(4) 角色
(5) 用户
4. 测试
(1) 有权限用户部署构件
(2) 无权限用户部署构件
(3) 从仓库下载自定义构件
二. 创建仓库
1. 创建仓库Foo Releases
2. 创建仓库Foo Snapshots
3. 把这两个仓库加入仓库组
三. 创建仓库目标(请求路径过滤)
1. 概念:匹配请求路径中哪些路径才是合法的,请求路径的组成格式是:http://仓库地址/groupId/artfactId/版本号
http://192.168.0.105:8086/nexus/content/repositories/snapshots/com/lemon/java/java_07_maven/1.0-SNAPSHOT/java_07_maven-1.0-20200131.092633-1.jar
仓库地址:192.168.0.105:8086/nexus/content/repositories/snapshots
groupId:com/lemon/java
artfactId:java_07_maven #项目名
版本号:1.0-SNAPSHOT
分别对应pom.xml中的groupId、artfactId、version
2. 格式:匹配的格式是正则表达式,*表示通配
3. 仓库类型
四. 自定义仓库权限
1. 系统预设权限(不可修改)
(1) 仓库浏览:Repository View,在创建仓库的时候自动添加的权限
(2) 仓库目标:Repository Target,是针对所有仓库(不包括自定义仓库)的增删查改权限
(3) 应用:Application,针对系统访问资源的控制,比如
Scheduled Task Types - (read):执行的任务浏览
Artifact Dowload:构件下载
User Set Password - (create, read):用户密码设置
Checksum Search:校验和搜索
2. 自定义权限:基于仓库和仓库目标创建权限
(1) 创建发布型仓库:Foo Releases权限
这里的权限包括:创建权限、修改权限、删除权限、读取权限、浏览权限(系统预设)
(2) 创建快照型仓库:Foo Snapshots权限
基本同Foo Releases,只是相关说明改改即可,完成后的结果界面
五. 自定义创建角色并绑定权限
1. 创建一个Foo-deployer的角色,该角色具有Foo-Releases和Foo-Snapshots的所有权限
注意:这里可以根据需求创建不同的角色,不同的角色不同的权限,比如角色A拥有全部权限,角色B拥有读权限,然后不同的角色又可以分配给不同的用户,这样就达到了不同用户可以拥有不同的权限的目的
2. 创建一个baseroles的角色,该角色只具有系统预设的基本权限,没有发布的权限
六. 创建用户并绑定角色
1. 创建用户havepriv,添加Foo-deployee角色,拥有发布权限
2. 同样地,创建用户nopriv,添加baseroles角色,该角色只拥有系统预设的权限,没有发布权限
七. 测试无权限用户部署构件
1. 创建一个新的项目:myjartest,里面写一些代码
2. 修改settings.xml,添加配置
<!-- foo项目私服用户名和密码:nopriv没有发布权限 --> <server> <id>foo-release</id> <username>nopriv</username> <password>123456</password> </server> <server> <id>foo-snapshot</id> <username>nopriv</username> <password>123456</password> </server>
3. 修改pom.xml,添加配置
<!-- 部署Maven构件到私服 --> <distributionManagement> <!-- 发行版仓库 --> <repository> <id>foo-release</id> #和配置的server id要对应上 <name>foo release repository</name> <url>http://192.168.0.105:8086/nexus/content/repositories/FooReleases/</url> #对应Foo-Releases的url </repository> <!-- 快照版仓库 --> <snapshotRepository> <id>foo-snapshot</id> <name>foo snapshot repository</name> <url>http://192.168.0.105:8086/nexus/content/repositories/FooSnapshots/</url> #对应Foo-Snapshots的url </snapshotRepository> </distributionManagement>
4. 可以先编译下,不报错的话再执行下一步
5. 在工程目录下使用mvn deploy进行发布
发现报错,说明没有权限
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy (default-deploy) on project myjartest: Fail
ed to deploy artifacts: Could not transfer artifact com.maven.test:myjartest:jar:1.0-20200201.043755-1 from/to foo-snapshot (http:
//192.168.0.105:8086/nexus/content/repositories/FooSnapshots/): Access denied to: http://192.168.0.105:8086/nexus/content/reposito
ries/FooSnapshots/com/maven/test/myjartest/1.0-SNAPSHOT/myjartest-1.0-20200201.043755-1.jar, ReasonPhrase: Forbidden. -> [Help 1]
八. 测试有权限用户部署构件
1. 只需要修改settings.xml中的server配置
<!-- foo项目私服用户名和密码:havepriv没有发布权限 --> <server> <id>foo-release</id> <username>havepriv</username> <password>123456</password> </server> <server> <id>foo-snapshot</id> <username>havepriv</username> <password>123456</password> </server>
2. 重新使用mvn deploy进行发布,可以看到发布成功
3. 验证nexus,可以看到已经发布了jar包
九. 从仓库获取自定义构件
新建一个项目:verifyjartest,这个项目用来获取和调用上面发布的jar包。配置pom.xml,拉取到jar包再调用验证,发现结果正确