Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
S
shiro-sso
Project overview
Project overview
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
shiro-sso
Commits
d48fb7ee
Commit
d48fb7ee
authored
Aug 21, 2017
by
fangzhipeng
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
添加动态权限功能
parent
14da0f6d
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
365 additions
and
6 deletions
+365
-6
bigsys-shiro/src/main/resources/bigsys-shiro.xml
bigsys-shiro/src/main/resources/bigsys-shiro.xml
+1
-6
bigsys-webdemo/src/main/java/com/bigsys/webdemo/Service/AuthService.java
...src/main/java/com/bigsys/webdemo/Service/AuthService.java
+12
-0
bigsys-webdemo/src/main/java/com/bigsys/webdemo/Service/impl/AuthServiceImpl.java
...java/com/bigsys/webdemo/Service/impl/AuthServiceImpl.java
+169
-0
bigsys-webdemo/src/main/resources/fixed_shiro_auth.properties
...ys-webdemo/src/main/resources/fixed_shiro_auth.properties
+0
-0
bigsys-webdemo2/src/main/java/com/bigsys/webdemo/Service/AuthService.java
...src/main/java/com/bigsys/webdemo/Service/AuthService.java
+12
-0
bigsys-webdemo2/src/main/java/com/bigsys/webdemo/Service/impl/AuthServiceImpl.java
...java/com/bigsys/webdemo/Service/impl/AuthServiceImpl.java
+171
-0
bigsys-webdemo2/src/main/resources/fixed_shiro_auth.properties
...s-webdemo2/src/main/resources/fixed_shiro_auth.properties
+0
-0
No files found.
bigsys-shiro/src/main/resources/bigsys-shiro.xml
View file @
d48fb7ee
...
...
@@ -51,12 +51,7 @@
<property
name=
"loginUrl"
value=
"/static/login.html"
/>
<property
name=
"successUrl"
value=
"/"
/>
<property
name=
"unauthorizedUrl"
value=
"/static/unauthorized.html"
/>
<property
name=
"filterChainDefinitions"
>
<value>
/test = roles[admin]
/** = authc
</value>
</property>
<property
name=
"filterChainDefinitions"
value=
"#{authService.loadFilterChainDefinitions()}"
/>
</bean>
</beans>
\ No newline at end of file
bigsys-webdemo/src/main/java/com/bigsys/webdemo/Service/AuthService.java
0 → 100644
View file @
d48fb7ee
package
com
.
bigsys
.
webdemo
.
Service
;
/**
* Created by fangzhipeng on 2017/8/21.
*/
public
interface
AuthService
{
String
loadFilterChainDefinitions
();
void
reCreateFilterChains
();
}
bigsys-webdemo/src/main/java/com/bigsys/webdemo/Service/impl/AuthServiceImpl.java
0 → 100644
View file @
d48fb7ee
package
com
.
bigsys
.
webdemo
.
Service
.
impl
;
import
com.bigsys.webdemo.Service.AuthService
;
import
org.apache.shiro.spring.web.ShiroFilterFactoryBean
;
import
org.apache.shiro.web.filter.mgt.DefaultFilterChainManager
;
import
org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver
;
import
org.apache.shiro.web.servlet.AbstractShiroFilter
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.core.io.ClassPathResource
;
import
org.springframework.stereotype.Service
;
import
java.io.IOException
;
import
java.util.Iterator
;
import
java.util.Map
;
import
java.util.Properties
;
@Service
(
value
=
"authService"
)
public
class
AuthServiceImpl
implements
AuthService
{
//注意/r/n前不能有空格
private
static
final
String
CRLF
=
"\r\n"
;
private
static
final
String
LAST_AUTH_STR
=
"/** =authc\r\n"
;
@Autowired
(
required
=
false
)
private
ShiroFilterFactoryBean
shiroFilterFactoryBean
;
@Override
public
String
loadFilterChainDefinitions
()
{
StringBuffer
sb
=
new
StringBuffer
(
""
);
sb
.
append
(
getFixedAuthRule
())
.
append
(
getDynaAuthRule
())
.
append
(
getRestfulOperationAuthRule
())
.
append
(
LAST_AUTH_STR
);
return
sb
.
toString
();
}
/**
* 生成restful风格功能权限规则 后期再调整
* @return
*/
private
String
getRestfulOperationAuthRule
()
{
// List<Menu> urls = menuMapper.selectMenuRule();
StringBuffer
sb
=
new
StringBuffer
(
""
);
// for(Menu menu :urls ) {
// String url = menu.getUrl();
// if( url.startsWith("/")) {
// sb.append(url).append("=").append("authc, anyroles[").append(menu.getRoles()).append("]").append(CRLF);
// }
// }
sb
.
append
(
"/test = roles[admin]"
).
append
(
CRLF
);
return
sb
.
toString
();
}
//根据角色,得到动态权限规则
private
String
getDynaAuthRule
()
{
StringBuffer
sb
=
new
StringBuffer
(
""
);
/*
Map<String, Set<String>> rules = new HashMap<String,Set<String>>();
List<Role> roles = dao.queryEntitys("from Role r left join fetch r.menus", newObject[]{});
for(Role role: roles) {
for(Iterator<Menu> menus = role.getMenus().iterator(); menus.hasNext();) {
String url = menus.next().getUrl();
if(!url.startsWith("/")) {
url = "/"+ url;
}
if(!rules.containsKey(url)) {
rules.put(url, new HashSet<String>());
}
rules.get(url).add((role.getRoleCode()));
}
}
for(Map.Entry<String, Set<String>> entry :rules.entrySet()) {
sb.append(entry.getKey()).append(" = ").append("authc,anyroles").append(entry.getValue()).append(CRLF);
}
*/
return
sb
.
toString
();
}
//得到固定权限验证规则串
private
String
getFixedAuthRule
()
{
StringBuffer
sb
=
new
StringBuffer
(
""
);
ClassPathResource
cp
=
new
ClassPathResource
(
"fixed_shiro_auth.properties"
);
Properties
properties
=
new
Properties
();
try
{
properties
.
load
(
cp
.
getInputStream
());
}
catch
(
IOException
e
)
{
throw
new
RuntimeException
(
"load fixed_shiro_auth.properties error!"
);
}
for
(
Iterator
<
Object
>
its
=
properties
.
keySet
().
iterator
();
its
.
hasNext
();)
{
String
key
=
(
String
)
its
.
next
();
sb
.
append
(
key
).
append
(
" = "
).
append
(
properties
.
getProperty
(
key
).
trim
()).
append
(
CRLF
);
}
return
sb
.
toString
();
}
//此方法加同步锁
@Override
public
synchronized
void
reCreateFilterChains
()
{
AbstractShiroFilter
shiroFilter
=
null
;
try
{
shiroFilter
=
(
AbstractShiroFilter
)
shiroFilterFactoryBean
.
getObject
();
}
catch
(
Exception
e
)
{
throw
new
RuntimeException
(
"get ShiroFilter from shiroFilterFactoryBean error!"
);
}
PathMatchingFilterChainResolver
filterChainResolver
=(
PathMatchingFilterChainResolver
)
shiroFilter
.
getFilterChainResolver
();
DefaultFilterChainManager
manager
=(
DefaultFilterChainManager
)
filterChainResolver
.
getFilterChainManager
();
//清空老的权限控制
manager
.
getFilterChains
().
clear
();
shiroFilterFactoryBean
.
getFilterChainDefinitionMap
().
clear
();
shiroFilterFactoryBean
.
setFilterChainDefinitions
(
loadFilterChainDefinitions
());
//重新构建生成
Map
<
String
,
String
>
chains
=
shiroFilterFactoryBean
.
getFilterChainDefinitionMap
();
for
(
Map
.
Entry
<
String
,
String
>
entry
:
chains
.
entrySet
())
{
String
url
=
entry
.
getKey
();
String
chainDefinition
=
entry
.
getValue
().
trim
().
replace
(
" "
,
""
);
manager
.
createChain
(
url
,
chainDefinition
);
}
}
public
ShiroFilterFactoryBean
getShiroFilterFactoryBean
()
{
return
shiroFilterFactoryBean
;
}
public
void
setShiroFilterFactoryBean
(
ShiroFilterFactoryBean
shiroFilterFactoryBean
)
{
this
.
shiroFilterFactoryBean
=
shiroFilterFactoryBean
;
}
}
\ No newline at end of file
bigsys-webdemo/src/main/resources/fixed_shiro_auth.properties
0 → 100644
View file @
d48fb7ee
bigsys-webdemo2/src/main/java/com/bigsys/webdemo/Service/AuthService.java
0 → 100644
View file @
d48fb7ee
package
com
.
bigsys
.
webdemo
.
Service
;
/**
* Created by fangzhipeng on 2017/8/21.
*/
public
interface
AuthService
{
String
loadFilterChainDefinitions
();
void
reCreateFilterChains
();
}
bigsys-webdemo2/src/main/java/com/bigsys/webdemo/Service/impl/AuthServiceImpl.java
0 → 100644
View file @
d48fb7ee
package
com
.
bigsys
.
webdemo
.
Service
.
impl
;
import
com.bigsys.webdemo.Service.AuthService
;
import
org.apache.shiro.spring.web.ShiroFilterFactoryBean
;
import
org.apache.shiro.web.filter.mgt.DefaultFilterChainManager
;
import
org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver
;
import
org.apache.shiro.web.servlet.AbstractShiroFilter
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.core.io.ClassPathResource
;
import
org.springframework.stereotype.Service
;
import
java.io.IOException
;
import
java.util.Iterator
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Properties
;
@Service
(
value
=
"authService"
)
public
class
AuthServiceImpl
implements
AuthService
{
//注意/r/n前不能有空格
private
static
final
String
CRLF
=
"\r\n"
;
private
static
final
String
LAST_AUTH_STR
=
"/** =authc\r\n"
;
@Autowired
(
required
=
false
)
private
ShiroFilterFactoryBean
shiroFilterFactoryBean
;
@Override
public
String
loadFilterChainDefinitions
()
{
StringBuffer
sb
=
new
StringBuffer
(
""
);
sb
.
append
(
getFixedAuthRule
())
.
append
(
getDynaAuthRule
())
.
append
(
getRestfulOperationAuthRule
())
.
append
(
LAST_AUTH_STR
);
return
sb
.
toString
();
}
/**
* 生成restful风格功能权限规则 后期再调整
* @return
*/
private
String
getRestfulOperationAuthRule
()
{
// List<Menu> urls = menuMapper.selectMenuRule();
StringBuffer
sb
=
new
StringBuffer
(
""
);
// for(Menu menu :urls ) {
// String url = menu.getUrl();
// if( url.startsWith("/")) {
// sb.append(url).append("=").append("authc, anyroles[").append(menu.getRoles()).append("]").append(CRLF);
// }
// }
sb
.
append
(
"/test = roles[admin]"
).
append
(
CRLF
)
.
append
(
"/hello = roles[user]"
).
append
(
CRLF
);
return
sb
.
toString
();
}
//根据角色,得到动态权限规则
private
String
getDynaAuthRule
()
{
StringBuffer
sb
=
new
StringBuffer
(
""
);
/*
Map<String, Set<String>> rules = new HashMap<String,Set<String>>();
List<Role> roles = dao.queryEntitys("from Role r left join fetch r.menus", newObject[]{});
for(Role role: roles) {
for(Iterator<Menu> menus = role.getMenus().iterator(); menus.hasNext();) {
String url = menus.next().getUrl();
if(!url.startsWith("/")) {
url = "/"+ url;
}
if(!rules.containsKey(url)) {
rules.put(url, new HashSet<String>());
}
rules.get(url).add((role.getRoleCode()));
}
}
for(Map.Entry<String, Set<String>> entry :rules.entrySet()) {
sb.append(entry.getKey()).append(" = ").append("authc,anyroles").append(entry.getValue()).append(CRLF);
}
*/
return
sb
.
toString
();
}
//得到固定权限验证规则串
private
String
getFixedAuthRule
()
{
StringBuffer
sb
=
new
StringBuffer
(
""
);
ClassPathResource
cp
=
new
ClassPathResource
(
"fixed_shiro_auth.properties"
);
Properties
properties
=
new
Properties
();
try
{
properties
.
load
(
cp
.
getInputStream
());
}
catch
(
IOException
e
)
{
throw
new
RuntimeException
(
"load fixed_shiro_auth.properties error!"
);
}
for
(
Iterator
<
Object
>
its
=
properties
.
keySet
().
iterator
();
its
.
hasNext
();)
{
String
key
=
(
String
)
its
.
next
();
sb
.
append
(
key
).
append
(
" = "
).
append
(
properties
.
getProperty
(
key
).
trim
()).
append
(
CRLF
);
}
return
sb
.
toString
();
}
//此方法加同步锁
@Override
public
synchronized
void
reCreateFilterChains
()
{
AbstractShiroFilter
shiroFilter
=
null
;
try
{
shiroFilter
=
(
AbstractShiroFilter
)
shiroFilterFactoryBean
.
getObject
();
}
catch
(
Exception
e
)
{
throw
new
RuntimeException
(
"get ShiroFilter from shiroFilterFactoryBean error!"
);
}
PathMatchingFilterChainResolver
filterChainResolver
=(
PathMatchingFilterChainResolver
)
shiroFilter
.
getFilterChainResolver
();
DefaultFilterChainManager
manager
=(
DefaultFilterChainManager
)
filterChainResolver
.
getFilterChainManager
();
//清空老的权限控制
manager
.
getFilterChains
().
clear
();
shiroFilterFactoryBean
.
getFilterChainDefinitionMap
().
clear
();
shiroFilterFactoryBean
.
setFilterChainDefinitions
(
loadFilterChainDefinitions
());
//重新构建生成
Map
<
String
,
String
>
chains
=
shiroFilterFactoryBean
.
getFilterChainDefinitionMap
();
for
(
Map
.
Entry
<
String
,
String
>
entry
:
chains
.
entrySet
())
{
String
url
=
entry
.
getKey
();
String
chainDefinition
=
entry
.
getValue
().
trim
().
replace
(
" "
,
""
);
manager
.
createChain
(
url
,
chainDefinition
);
}
}
public
ShiroFilterFactoryBean
getShiroFilterFactoryBean
()
{
return
shiroFilterFactoryBean
;
}
public
void
setShiroFilterFactoryBean
(
ShiroFilterFactoryBean
shiroFilterFactoryBean
)
{
this
.
shiroFilterFactoryBean
=
shiroFilterFactoryBean
;
}
}
\ No newline at end of file
bigsys-webdemo2/src/main/resources/fixed_shiro_auth.properties
0 → 100644
View file @
d48fb7ee
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment