前言
shiro本次是简化代码,所以就是授权和注解式可以加快开发进程,和优化代码结构。
不再用自己去一个个去配置
配置我们就换成了注解式配置
当然,因为我们操控的Controller是给
springmvc-servlet.xml所管理的,所以我们得在springmvc的管理下加上
springmvc-servlet.xml
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
depends-on="lifecycleBeanPostProcessor">
<property name="proxyTargetClass" value="true"></property>
</bean>
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<property name="securityManager" ref="securityManager"/>
</bean>
<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="org.apache.shiro.authz.UnauthorizedException">
unauthorized
</prop>
</props>
</property>
<property name="defaultErrorView" value="unauthorized"/>
</bean>
授权
现在这个就是可以自动授权
当然这个就是我们在自己定义的一个Realm源里的自带方法
重点:每当你去访问被shiro特有标签管理的Controller方法,就会调用一次MyRealm
/**
* 授权
* @param principalCollection
* @return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
String username = principalCollection.getPrimaryPrincipal().toString();
String pwd = principalCollection.getRealmNames().toString();
ShiroUser shiroUser = shiroUserService.getUserByUserName(username);
//获取这个用户的角色,权限
Set<String> rolesByUserId = shiroUserService.getRolesByUserId(shiroUser.getUserid());
Set<String> persByUserId = shiroUserService.getPersByUserId(shiroUser.getUserid());
//给这个登录的用户赋予相对应的角色,权限
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
info.setRoles(rolesByUserId);
info.setStringPermissions(persByUserId);
return info;
}
注解式开发
常用注解介绍
@RequiresAuthenthentication:表示当前Subject已经通过login进行身份验证;即 Subject.isAuthenticated()返回 true
@RequiresUser:表示当前Subject已经身份验证或者通过记住我登录的
@RequiresGuest:表示当前Subject没有身份验证或者通过记住我登录过,即是游客身份
@RequiresRoles(value = {“admin”,“user”},logical = Logical.AND):表示当前Subject需要角色admin和user
@RequiresPermissions(value = {“user:delete”,“user:b”},logical = Logical.OR):表示当前Subject需要权限user:delete或者user:b
用案例来讲就是这个:
@RequiresUser
@RequestMapping("/passUser")
public String passUser(HttpServletRequest req){//通过身份验证的就可以访问这个
return "admin/addUser";
}
@RequiresRoles(value = {"1","4"},logical = Logical.OR)
@RequestMapping("/passRole")
public String passRole(HttpServletRequest req){//如果用户的角色id有1或者4就可以访问
return "admin/listUser";
}
@RequiresPermissions(value = {"user:create"})
@RequestMapping("/passPer")
public String passPer(HttpServletRequest req){//如果用户的权限有user:create就可以访问
return "admin/resetPwd";
}
测试
没什么,就造几个a标签去登录后访问一下
shiro标签
<li>
<r:hasPermission name="user:create">
<a href="${pageContext.request.contextPath}/passUser">用户验证后可看的见</a>
</r:hasPermission>
</li>
<li>
<a href="${pageContext.request.contextPath}/passRole">有这个1 or 4角色的用户才能使用</a>
</li>
<li>
<a href="${pageContext.request.contextPath}/passPer">有这个user:create 的用户才能使用 </a>
</li>
后记
如果不怎么明白的可以往我前面翻一翻