shiro springmvcc + shiro 整合,shiro注解无效什么鬼

Shiro想必大家都知道了,之前的文章我也有提过,是目前使用率要比spring security都要多的一个权限框架,本身spring自己都在用shiro,之前的文章有兴趣可以去扒一下
最近正好用到shiro,简单聊聊几个小tips吧
&!-- 对静态资源设置匿名访问,即可以未登录状态下访问 --&
/images/** = anon
/js/** = anon
/styles/** = anon
/css/** = anon
/page/getOrders.action = perms[order:query]
/page/editOrderItemCounts.action = perms[order:edit]
在对资源访问的时候需要对url进行权限配置,在spring-shiro.xml中需要配置大量的上述代码,这样做可以,但是十分的冗余,而且也不利于后期维护,就像当初的hibernate一样,有很多的hbm文件,所以后来很多人都是用了注解形式,当然了,shiro也支持注解,这样的话会非常方便,程序员再开发代码的时候就可以完善相应的权限
在springmvc.xml中进行配置
&!-- 开启aop,对类代理 --&
&aop:config proxy-target-class="true"&&/aop:config&
&!-- 开启shiro注解支持 --&
&bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"&
&property name="securityManager" ref="securityManager" /&
这样就可以在代码中使用注解了,需要注意的是,注解可以再controller, service 以及dao层使用,但是建议再controller中拦截,因为入口只有一个,而其他两层的方法是可以公用的
@RequiresPermissions("order:query")
另外jsp上可以这样使用:
&shiro:hasPermission name="order:edit"&
&a href="&%=request.getContextPath() %&/page/editOrderItemCounts"&修改商品&/a&
&/shiro:hasPermission&
&br/&&br/&
&shiro:hasPermission name="order:query"&当前用户有查询订单权限&/shiro:hasPermission&
&shiro:lacksPermission name="order:add"&当前用户没有下单权限&/shiro:lacksPermission&
OK,这样整个权限的控制就没有问题了,直接控制到资源,而不是角色。
&shiro:authenticated&
&shiro:notAuthenticated&
不在登录状态时
&shiro:guest&
用户在没有RememberMe时
&shiro:user&
用户在RememberMe时
&shiro:hasAnyRoles name="abc,123" &
在有abc或者123角色时
&shiro:hasRole name="abc"&
拥有角色abc
&shiro:lacksRole name="abc"&
没有角色abc
&shiro:hasPermission name="abc"&
拥有权限资源abc
&shiro:lacksPermission name="abc"&
没有abc权限资源
&shiro:principal&
显示用户身份名称
&shiro:principal property="username"/&
显示用户身份中的属性值
最后再附上一张最基本的5张数据库权限表
阅读(...) 评论()spring mvc 集成shiro 做权限的简单使用
我的图书馆
spring mvc 集成shiro 做权限的简单使用
现在的项目使用的权限控制系统是spring security 3.因为项目的框架使用spring,就顺便使用了。最近研究了一下spring side4,推荐使用shiro。照着示例做了一遍。在原有的spring web工程中。步骤如下。
2.引进包,maven设置
[html] &dependency&&&&&&&&groupId&org.apache.shiro&/groupId&&&&&&&&artifactId&shiro-all&/artifactId&&&&&&&&version&1.2.1&/version&&&&&&&&type&jar&/type&&&&&&&&scope&compile&/scope&&&&&&&/dependency&&&
3.实现Controller层
主要是登陆url和几个掩饰url
[java] @Controller&&public&class&AdminController&{&&&&&&&&@RequestMapping(value&=&"/admin/index",&method&=&RequestMethod.GET)&&&&&&public&String&index(Model&model)&{&&&&&&&&&&&&return&"admin/index";&&&&&&}&&&&&&&&&&&&&&&&&&@RequestMapping(value&=&"/admin/login",&method&=&RequestMethod.GET)&&&&&&public&String&login(Model&model)&{&&&&&&&&&&("login&get");&&&&&&&&&&return&"admin/login";&&&&&&}&&&&&&&&&&&&&&&&&&@RequestMapping(value&=&"/admin/login",&method&=&RequestMethod.POST)&&&&&&public&String&doLogin(Model&model)&{&&&&&&&&&&("login&post");&&&&&&&&&&return&"admin/login";&&&&&&}&&&&&&&&&&&&@RequiresRoles("user")&&&&&&@RequestMapping(value&=&"/admin/user",&method&=&RequestMethod.GET)&&&&&&public&String&shiroUser(Model&model)&{&&&&&&&&&&&&&&&&return&"admin/index";&&&&&&}&&&&&&&&&&&&@RequiresRoles("admin")&&&&&&@RequestMapping(value&=&"/admin/admin",&method&=&RequestMethod.GET)&&&&&&public&String&shiroAdmin(Model&model)&{&&&&&&&&&&&&&&&&&&&&return&"admin/index";&&&&&&}&&&&&&&&&&&&Logger&logger&=&LoggerFactory.getLogger(AdminController.class);&&&&}&&
4.实现权限验证
继承shiro的AuthorizingRealm
[java] public&class&ShiroDbRealm&extends&AuthorizingRealm&{&&&&&&&&protected&AccountService&accountS&&&&&&&&@Autowired&&&&&&public&void&setAccountService(AccountService&accountService)&{&&&&&&&&&&this.accountService&=&accountS&&&&&&}&&&&&&&&/**&&&&&&*&授权查询回调函数,&进行鉴权但缓存中无用户的授权信息时调用.&&&&&&*/&&&&&&&&@SuppressWarnings("unused")&&&&&&@Override&&&&&&protected&AuthorizationInfo&doGetAuthorizationInfo(PrincipalCollection&p)&{&&&&&&&&&&&&("授权认证:"&+&p.getRealmNames());&&&&&&&&&&&&&&&&&&&&ShiroUser&shiroUser&=&(ShiroUser)&p.getPrimaryPrincipal();&&&&&&&&&&User&user&=&accountService.findUserByLoginName(shiroUser.loginName);&&&&&&&&&&&&SimpleAuthorizationInfo&info&=&new&SimpleAuthorizationInfo();&&&&&&&&&&for&(Role&role&:&user.getRoleList())&{&&&&&&&&&&&&&&//基于Role的权限信息&&&&&&&&&&&&&&info.addRole(role.getName());&&&&&&&&&&&&&&//基于Permission的权限信息&&&&&&&&&&&&&&info.addStringPermission(role.getPermissions());&&&&&&&&&&}&&&&&&&&&&return&&&&&&&&&&&&&&&&&}&&&&&&&&/**&&&&&&*&认证回调函数,登录时调用.&&&&&&*/&&&&&&@Override&&&&&&protected&AuthenticationInfo&doGetAuthenticationInfo(&&&&&&&&&&&&&&AuthenticationToken&authcToken)&throws&AuthenticationException&{&&&&&&&&&&("authc&pass:");&&&&&&&&&&UsernamePasswordToken&token&=&(UsernamePasswordToken)&authcT&&&&&&&&&&("authc&name:"&+&token.getUsername());&&&&&&&&&&User&user&=&accountService.findUserByLoginName(token.getUsername());&&&&&&&&&&if&(user&!=&null)&{&&&&&&&&&&&&&&&&if&(user.getStatus().equals("disabled"))&{&&&&&&&&&&&&&&&&&&throw&new&DisabledAccountException();&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&("authc&name:"&+&token.getUsername()&+&"&user:"&&&&&&&&&&&&&&&&&&&&&&+&user.getLoginName()&+&"&pwd:"&+&user.getPassword()&&&&&&&&&&&&&&&&&&&&&&+&"getname:"&+&getName());&&&&&&&&&&&&&&&&//&byte[]&salt&=&Encodes.decodeHex(user.getSalt());&&&&&&&&&&&&&&return&new&SimpleAuthenticationInfo(new&ShiroUser(user.getLoginName(),&user.getName()),&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&user.getPassword(),&getName());&&&&&&&&&&}&&&&&&&&&&return&&&&&&&&&}&&&&&&&&/**&&&&&&*&自定义Authentication对象,使得Subject除了携带用户的登录名外还可以携带更多信息.&&&&&&*/&&&&&&public&static&class&ShiroUser&implements&Serializable&{&&&&&&&&&&private&static&final&long&serialVersionUID&=&-0840081L;&&&&&&&&&&public&String&loginN&&&&&&&&&&public&String&&&&&&&&&&&&&public&ShiroUser(String&loginName,&String&name)&{&&&&&&&&&&&&&&this.loginName&=&loginN&&&&&&&&&&&&&&this.name&=&&&&&&&&&&&}&&&&&&&&&&&&public&String&getName()&{&&&&&&&&&&&&&&return&loginN&&&&&&&&&&}&&&&&&&&&&&&/**&&&&&&&&&&*&本函数输出将作为默认的&shiro:principal/&输出.&&&&&&&&&&*/&&&&&&&&&&@Override&&&&&&&&&&public&String&toString()&{&&&&&&&&&&&&&&return&loginN&&&&&&&&&&}&&&&&&&&&&&&/**&&&&&&&&&&*&重载hashCode,只计算loginN&&&&&&&&&&*/&&&&&&&&&&@Override&&&&&&&&&&public&int&hashCode()&{&&&&&&&&&&&&&&return&Objects.hashCode(loginName);&&&&&&&&&&}&&&&&&&&&&&&/**&&&&&&&&&&*&重载equals,只计算loginN&&&&&&&&&&*/&&&&&&&&&&@Override&&&&&&&&&&public&boolean&equals(Object&obj)&{&&&&&&&&&&&&&&if&(this&==&obj)&&&&&&&&&&&&&&&&&&return&&&&&&&&&&&&&&&if&(obj&==&null)&&&&&&&&&&&&&&&&&&return&&&&&&&&&&&&&&&if&(getClass()&!=&obj.getClass())&&&&&&&&&&&&&&&&&&return&&&&&&&&&&&&&&&ShiroUser&other&=&(ShiroUser)&&&&&&&&&&&&&&&if&(loginName&==&null)&{&&&&&&&&&&&&&&&&&&if&(other.loginName&!=&null)&&&&&&&&&&&&&&&&&&&&&&return&&&&&&&&&&&&&&&}&else&if&(!loginName.equals(other.loginName))&&&&&&&&&&&&&&&&&&return&&&&&&&&&&&&&&&return&&&&&&&&&&&}&&&&&&}&&&&&&&&Logger&logger&=&LoggerFactory.getLogger(ShiroDbRealm.class);&&&&}&&
自定义的类ShiroUser是为了,可以多传输一些内容,供后面验证时使用,例子中只用了一个loginName,一般可以用String 传输就够了。
登陆时用doGetAuthenticationInfo()函数获得相关信息。
登陆后访问url 使用doGetAuthorizationInfo()获得用户的权限。
5.配置文件shiro部分
将controller的url纳入权限验证范围。
[html] &?xml&version="1.0"&encoding="UTF-8"?&&&&beans&xmlns="http://www.springframework.org/schema/beans"&xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&&&&&&xsi:schemaLocation="http://www.springframework.org/schema/beans&http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"&&&&&&default-lazy-init="true"&&&&&&&&&&description&Shiro安全配置&/description&&&&&&&&&&&&&&&&&&!--&項目自定义的Realm&--&&&&&&&&bean&id="shiroDbRealm"&class="com.blueinfo.jee.shiro.ShiroDbRealm"&depends-on="userDao,roleDao"&&&&&&&&&&&&property&name="accountService"&ref="accountService"/&&&&&&&&/bean&&&&&&&&&&&&&&!--&Shiro&Filter&--&&&&&&&&bean&id="shiroFilter"&class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"&&&&&&&&&&&&property&name="securityManager"&ref="securityManager"&/&&&&&&&&&&&&property&name="loginUrl"&value="/admin/login"&/&&&&&&&&&&&&property&name="successUrl"&value="/admin/index"&/&&&&&&&&&&&&property&name="unauthorizedUrl"&value="/admin/logout"&/&&&&&&&&&&&&property&name="filterChainDefinitions"&&&&&&&&&&&&&&&&value&&&&&&&&&&&&&&&&&&&/admin/login&=&authc&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/admin/logout&=&logout&&&&&&&&&&&&&&&&&&/static/**&=&anon&&&&&&&&&&&&&&&&&&/admin/**&=&authc&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/value&&&&&&&&&&&&/property&&&&&&&&/bean&&&&&&&&&&!--&用户授权信息Cache,&采用EhCache&--&&&&&&&&bean&id="shiroEhcacheManager"&class="org.apache.shiro.cache.ehcache.EhCacheManager"&&&&&&&&&&&&property&name="cacheManagerConfigFile"&value="classpath:security/ehcache-shiro.xml"/&&&&&&&&/bean&&&&&&&&&&&&&&!--&Shiro's&main&business-tier&object&for&web-enabled&applications&--&&&&&&&&bean&id="securityManager"&class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"&&&&&&&&&&&&property&name="realm"&ref="shiroDbRealm"&/&&&&&&&&&&&&property&name="cacheManager"&ref="shiroEhcacheManager"&/&&&&&&&&/bean&&&&&&&&&&&&&&&&&&&&!--&保证实现了Shiro内部lifecycle函数的bean执行&--&&&&&&&&bean&id="lifecycleBeanPostProcessor"&class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/&&&&&&&&&&&&&&!--&AOP式方法级权限检查&&--&&&&&&&&bean&class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"&depends-on="lifecycleBeanPostProcessor"&&&&&&&&&&&&property&name="proxyTargetClass"&value="true"&/&&&&&&&&/bean&&&&&&&&bean&class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"&&&&&&&&&&&&property&name="securityManager"&ref="securityManager"/&&&&&&&&/bean&&&&/beans&&&
主要内容是shiroFilter的定义。
loginUrl:登陆页面,用户登陆不成功,自动返回此页面。
successUrl:登陆成功后跳转此页面
unauthorizedUrl:用户访问无权限的链接时跳转此页面
filterChainDefinitions:设置url的访问权限。anon表示不用验证,都可以访问。anthc:authc
filter 监听,不登陆不能访问。logout:logout filter监听。没有列出的常用配置:perms["remote:invoke"]
:需要角色romote 和权限invoke才能访问。roles["admin"]需要角色admin才能访问。设置可用“,”隔开,如:
/admin/test = authc,roles[admin]
关于filter的列表:
Filter Name
org.apache.shiro.web.filter.authc.AnonymousFilter
org.apache.shiro.web.filter.authc.FormAuthenticationFilter
authcBasic
org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter
org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter
org.apache.shiro.web.filter.authz.PortFilter
org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter
org.apache.shiro.web.filter.authz.RolesAuthorizationFilter
org.apache.shiro.web.filter.authz.SslFilter
org.apache.shiro.web.filter.authc.UserFilter
6.配置文件,启用shiroFilter
上面的配置和源码定义了shiroFilter,在web.xml中启用它
[html] &!--&Shiro&Security&filter&--&&&&&&&&&&&&&&filter&&&&&&&&&&&&filter-name&shiroFilter&/filter-name&&&&&&&&&&&&filter-class&org.springframework.web.filter.DelegatingFilterProxy&/filter-class&&&&&&&&/filter&&&&&&&&filter-mapping&&&&&&&&&&&&filter-name&shiroFilter&/filter-name&&&&&&&&&&&&url-pattern&/*&/url-pattern&&&&&&&&&&&&dispatcher&REQUEST&/dispatcher&&&&&&&&&&&&dispatcher&FORWARD&/dispatcher&&&&&&&&/filter-mapping&&&
7.使用annotation控制权限
在2中controller使用@RequiresRoles 注解控制权限,还可以是@RequirePermissions,要在方法上使用注解需要做如下配置:
1.在spring-mvc.xml中加入
[html] &!--&支持&Shiro对Controller的方法级AOP安全控制--&&&&bean&class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"&depends-on="lifecycleBeanPostProcessor"&&&&&&&&property&name="proxyTargetClass"&value="true"&/&&&&/bean&&&&&&bean&class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"&&&&&&&&property&name="securityManager"&ref="securityManager"/&&&&/bean&&&
2.出错控制,在spring-mvc.xml中加入
[html] &!--&将Controller抛出的异常转到特定View&--&&&&&&&&bean&class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"&&&&&&&&&&&&&&property&name="exceptionMappings"&&&&&&&&&&&&&&&&&&props&&&&&&&&&&&&&&&&&&&&prop&key="org.apache.shiro.authz.UnauthorizedException"&error/403&/prop&&&&&&&&&&&&&&&&&&&&prop&key="java.lang.Throwable"&error/500&/prop&&&&&&&&&&&&&&&&/props&&&&&&&&&&&&&&/property&&&&&&&&&&/bean&&&&将UnauthorizedException异常转到403页面,也可以使用其它页面.
1,文中的内容大部分来源于开源工程,,真心感谢其作者江南白衣
2.apache-shiro官网:
TA的最新馆藏[转]&[转]&[转]&[转]&[转]&[转]&现在位置:
管理系统订制开发
&&欢迎您就基于JAVA EE平台的管理信息系统的订制开发与我们合作,我们不仅是为企业提供软件,而是提供一套完整的信息化解决方案及相应的服务。我们有着丰富的管理系统的开发与实施经验,能依据企业的实际情况开发、实施相应的管理及应用系统,使应用系统能在企业的日常经营管理中起到实实在在的作用。
&&咨询QQ:shiro-入门,快速与springmvc整合,全注解,最简单让项目运行起来
笔记:springboot、springmvc全注解入门整合shiro
该示例:大概功能如下:
由于角色可以自由创建,拥有权限分配的功能的帐号,可以把自身的权限分配给创建的角色。所以本人只想到了,使用请求地址来控制每一个权限。
整合开始:
1.添加shiroFilter过滤器
在能替代web.xml的配置类中添加过滤器
* 用注解方式,类里面配置,完全取代 web.xml中的配置
@HandlesTypes(WebApplicationInitializer.class)
public class WebXml implements ServletContextInitializer {
Logger logger = LoggerFactory.getLogger(getClass());
public void onStartup(ServletContext servletContext) throws ServletException {
(&加载shiro过滤器,与spring集成&);
* 找名字为shiroFilter(filter-name)的bean 并把所有Filter的操作委托给它。然后将ShiroFilter
* 配置到spring容器即可
Dynamic shiroFilter = servletContext.addFilter(&shiroFilter&, DelegatingFilterProxy.class);
shiroFilter.setInitParameter(&argetFilterLifecycl&, &true&);
shiroFilter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), false, &/*&);
shiroFilter.setAsyncSupported(true);
2.配置WebMvcConfigurer
下面的类中有点多,但是指需要添加与shiro先关的几个bean就成了。
之前的是在项目中配置好的
public class WebConfig extends WebMvcConfigurerAdapter {
Logger logger = LoggerFactory.getLogger(getClass());
public ServletContextInitializer getMyFilter() {
(&注册web.xml中对应的配置都可以在这里类里面编写-----------&);
return new WebXml();
* 添加全局异常处理器 1:这里好像是不用屏蔽 springmvc自动注册的全局异常处理器 2:编写自定义处理器 实现
* HandlerExceptionResolver 3:在这里加载
public HandlerExceptionResolver getHandlerExceptionResolver() {
(&加载自定义异常处理器&);
return new ExceptionResolverCustom();
public void addInterceptors(InterceptorRegistry registry) {
(&自定义拦截器在这里增加&);
registry.addInterceptor(new LoginInterceptor());
super.addInterceptors(registry);
public EmbeddedServletContainerCustomizer containerCustomizer() {
(&加载错误页面相关处理,spring boot中可以对根据对应的状态码,比如404,等添加指定的页面&);
return new MyCustomizer();
public SessionIdGenerator sessionIdGenerator() {
JavaUuidSessionIdGenerator jusg = new JavaUuidSessionIdGenerator();
public EnterpriseCacheSessionDAO sessionDao() {
EnterpriseCacheSessionDAO ecd = new EnterpriseCacheSessionDAO();
ecd.setSessionIdGenerator(this.sessionIdGenerator());
ecd.setCacheManager(this.shiroCacheManager());
private EhCacheManager ec
public EhCacheManager shiroCacheManager() {
if(ec == null) {
ec = new EhCacheManager();
ec.setCacheManagerConfigFile(&classpath:ehcache-shiro.xml&);
public SessionManager sessionManager() {
DefaultWebSessionManager dwsm = new DefaultWebSessionManager();
dwsm.setGlobalSessionTimeout(1800000);
dwsm.setDeleteInvalidSessions(true);
dwsm.setSessionDAO(this.sessionDao());
public SecurityManager securityManager() {
UserRealm singleRealm = new UserRealm();
singleRealm.setAuthorizationCachingEnabled(true);
DefaultWebSecurityManager dwsm = new DefaultWebSecurityManager(singleRealm);
dwsm.setSessionManager(this.sessionManager());
public MethodInvokingFactoryBean methodInvokingFactoryBean() {
MethodInvokingFactoryBean mifb = new MethodInvokingFactoryBean();
mifb.setStaticMethod(&org.apache.shiro.SecurityUtils.setSecurityManager&);
mifb.setArguments(new Object[] {this.securityManager()});
@Bean(name=&shiroFilter&)
public ShiroFilterFactoryBean shiroFilterFactoryBean () {
ShiroFilterFactoryBean sffb = new ShiroFilterFactoryBean();
sffb.setSecurityManager(this.securityManager());
sffb.setLoginUrl(&/login.html&);
sffb.setUnauthorizedUrl(&/unAuthc.html&);
Map&String, Filter& filters = new HashMap&&();
filters.put(&sysUser&, new SysUserFilter());
sffb.setFilters(filters);
Map&String, String& filterChainDefinitionMap = new LinkedHashMap&String, String&();
filterChainDefinitionMap.put(&/login.html&, &anon&);
filterChainDefinitionMap.put(&/system/login/login&, &anon&);
filterChainDefinitionMap.put(&/system/login/logOut&, &anon&);
filterChainDefinitionMap.put(&/errorCustom.html&, &anon&);
filterChainDefinitionMap.put(&/unAuthc.html&, &anon&);
filterChainDefinitionMap.put(&/views/app.js&, &anon&);
filterChainDefinitionMap.put(&/js/**&, &anon&);
filterChainDefinitionMap.put(&/&, &anon&);
filterChainDefinitionMap.put(&/images/**&, &anon&);
filterChainDefinitionMap.put(&/imag/**&, &anon&);
filterChainDefinitionMap.put(&/wxMessagePic/*&, &anon&);
filterChainDefinitionMap.put(&/css/**&, &anon&);
filterChainDefinitionMap.put(&/**&, &sysUser&);
public LifecycleBeanPostProcessor LifecycleBeanPostProcessor() {
return new LifecycleBeanPostProcessor();
3.编写自定义UserRealm
获取spring容器思路:
import org.apache.shiro.realm.AuthorizingR
public class UserRealm extends AuthorizingRealm {
* 获取授权信息,用户所拥有的角色和权限
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
ShiroPrincipal shiroPrincipal = (ShiroPrincipal) principals.getPrimaryPrincipal();
Set&String& psIds = null;
if (shiroPrincipal.isAuthorized()) {
psIds = shiroPrincipal.getAuthorities();
ISecurityService iss = Config.webApplicationContext.getBean(ISecurityService.class);
psIds = iss.findByUsername(shiroPrincipal.getUsername());
shiroPrincipal.setAuthorized(true);
} catch (Exception e) {
e.printStackTrace();
SimpleAuthorizationInfo si = new SimpleAuthorizationInfo();
si.setStringPermissions(psIds);
* 获取身份验证相关信
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
String username = (String) token.getPrincipal();
String password = new String((char[]) token.getCredentials());
ShiroPrincipal principal = new ShiroPrincipal(username);
return new SimpleAuthenticationInfo(principal, password, this.getName());
4.编写自定义过滤器
import org.apache.shiro.SecurityU
import org.apache.shiro.subject.S
import org.apache.shiro.web.filter.PathMatchingF
public class SysUserFilter extends PathMatchingFilter {
protected boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
HttpServletRequest req = (HttpServletRequest)
HttpServletResponse res = (HttpServletResponse)
String url = req.getRequestURI();
Subject subject = SecurityUtils.getSubject();
String username = (String)subject.getPrincipal();
if(&superadmin&.equals(username)) {
return true;
Integer rulKey = this.matchingURL(url);
if(subject.isPermitted(rulKey+&&)) {
return true;
String method = req.getMethod();
String header = req.getHeader(&Accept&);
if(header.startsWith(&application/json&)) {
JSONObject responseJSONObject = new JSONObject();
responseJSONObject.put(&0&, &你没有该权限&);
res.setContentType(&application/ charset=utf-8&);
res.setCharacterEncoding(&UTF-8&);
PrintWriter out = null;
out = res.getWriter();
out.append(responseJSONObject.toString());
res.sendRedirect(&/unAuthc.html&);
return false;
*: matchingURL
*:根据当前请求地址获取标准的公共权限地址,只要是正常的访问。就应该能和公共权限中 一一对应查找到
* currentUrl
* Integer 获取到后,返回该公共地址的权限id,返回null,则表示请求的资源在公共权限库中没有找到(待定义处理)
* 日 下午4:00:40
* 日 下午4:00:40
private Integer matchingURL(String currentUrl) {
Map&Integer, String& authUrls = StaticCache.authU
for (Map.Entry&Integer, String& url : authUrls.entrySet()) {
if(currentUrl.contains(url.getValue())) {
return url.getKey();
return null;
用一张图来表示,shiro大概的入门调用流程,这个是自己花了一天时间理解的。也不知道对不对。反正就先这样用着先。
总结步骤:
1.添加shiro过滤器入口(一定要保证白过滤器在其他过滤器之前,至少在配置清单中在最前面)
2:配置安全管理器,设置自定义realm
3:配置web过滤器(也就是定义shiroFilter,定义的入口会搜寻该对象),设置权限,设置自定义过滤器拦截权限处理
本分类共有文章1篇,更多信息详见
& 2012 - 2016 &
&All Rights Reserved. &
/*爱悠闲图+*/
var cpro_id = "u1888441";

我要回帖

更多关于 cas shiro springmvc 的文章

 

随机推荐