龙空技术网

学习shiro认证授权?看这一篇就够了!史上最傻瓜式儿用法讲解!

IT讲坛 4376

前言:

今天大家对“shiro认证每次请求都要”大致比较关怀,看官们都需要学习一些“shiro认证每次请求都要”的相关资讯。那么小编也在网上网罗了一些对于“shiro认证每次请求都要””的相关知识,希望朋友们能喜欢,小伙伴们一起来了解一下吧!

写在前面

什么事Shiro?

Shiro是一个强大易用的Java安全框架,用在身份验证、授权、密码学和会话管理。有了Shiro易于理解的API,我们可以快速、轻松地获得任何应用程序,从小的移动应用程序到大的网络甚至企业应用程序都是可以的。

Shiro的主要框架图:

走进shiro

Subject是主体,外部应用与subject进行交互,subject则会记录当前操作用户,将用户的概念理解为当前操作的主体,可以是一个通过浏览器请求的用户,也可以是一个运行的程序。 Subject在shiro中是一个接口,接口中定义了很多认证授相关的方法,外部程序通过subject进行认证授权,而subject是通过SecurityManager安全管理器进行认证授权的。

SecurityManager

SecurityManager是安全管理器,对全部的subject进行安全管理,它是shiro的核心,负责对所有的subject进行安全管理。通过SecurityManager可以完成subject的认证、授权等,实质上SecurityManager是通过Authenticator进行认证,通过Authorizer进行授权,通过SessionManager进行会话管理等。

SecurityManager是一个接口,同时它自身也继承了Authenticator, Authorizer, SessionManager这三个接口。

Authorizer

Authorizer是授权器,用户通过认证器认证通过,在访问功能时需要通过授权器判断用户是否有此功能的操作权限。

Authenticator

Authenticator是认证器,可以对用户身份进行认证,Authenticator是一个接口,shiro提供ModularRealmAuthenticator实现类,通过ModularRealmAuthenticator基本上可以满足大多数需求,也可以自定义认证器。

realm

Realm是领域,相当于datasource数据源,securityManager进行安全认证需要通过Realm获取用户权限数据,比如:如果用户身份数据在数据库那么realm就需要从数据库获取用户身份信息。

说明:

不要将realm理解成单单从数据源取数据,在realm中还有认证授权校验相关的代码。

SessionDAO

SessionDAO是会话dao层,是对session会话操作的一套接口,比如要将session存储到数据库,可以通过jdbc将会话存储到数据库。

sessionManager

sessionManager是会话管理,shiro框架定义了一套会话管理,它不依赖web容器的session,所以shiro可以使用在非web应用上,也可以将分布式应用的会话集中在一点管理,此特性可使它成为单点登录的利器。

Cryptography

Cryptography是密码管理,shiro提供了一套加密/解密的组件,方便开发。比如提供常用的散列、加/解密等功能。

CacheManager

CacheManager是缓存管理,将用户权限数据存储在缓存,这样可以提高性能。

shiro认证与授权的具体实现第一步:添加jar包

<!-- shiro --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.4.0</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.4.0</version> </dependency>
第二步:配置web.xml
 <filter> <filter-name>shiroFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <!-- 设置true由servlet容器控制filter的生命周期 --> <init-param> <param-name>targetFilterLifecycle</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>shiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
第三步:自定义Realm 继承AuthorizingRealm 重写 AuthorizationInfo(授权) 和 AuthenticationInfo(认证)

简单的测试 根据个人的设置和需求改变的。现在数据是死的,运用的时候需要从数据库中得到

/** * @author IT讲坛 * @date 2018/12/26 14:05 */public class CustomRealm extends AuthorizingRealm { /** * 授权 * @param principalCollection * @return */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { String userName = (String) principalCollection.getPrimaryPrincipal(); List<String> permissionList=new ArrayList<String>(); permissionList.add("user:add"); permissionList.add("user:delete"); if (userName.equals("zhou")) { permissionList.add("user:query"); } SimpleAuthorizationInfo info=new SimpleAuthorizationInfo(); info.addStringPermissions(permissionList); info.addRole("admin"); return info; } /** * 认证 * @param authenticationToken * @return * @throws AuthenticationException */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { String userName = (String) authenticationToken.getPrincipal(); if ("".equals(userName)) { return null; } SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(userName,"123456",this.getName()); return info; }}
第四步:配置spring-shiro.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="" xmlns:xsi="" xsi:schemaLocation=" "> <!--开启shiro的注解--> <bean id="advisorAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"> <property name="proxyTargetClass" value="true"></property> </bean> <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"/> <!--注入自定义的Realm--> <bean id="customRealm" class="com.test.realm.CustomRealm"></bean> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="customRealm"></property> </bean> <!--配置ShiroFilter--> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager"></property> <!--登入页面--> <property name="loginUrl" value="/login.jsp"></property> <!--登入成功页面--> <property name="successUrl" value="/index.jsp"/> <property name="filters"> <map> <!--退出过滤器--> <entry key="logout" value-ref="logoutFilter" /> </map> </property> <!--URL的拦截--> <property name="filterChainDefinitions" > <value> /share = authc /logout = logout </value> </property> </bean> <!--自定义退出LogoutFilter--> <bean id="logoutFilter" class="com.test.filter.SystemLogoutFilter"> <property name="redirectUrl" value="/login"/> </bean></beans>

说明:

securityManager: 这个属性是必须的。

loginUrl: 没有登录的用户请求需要登录的页面时自动跳转到登录页面,不是必须的属性,不输入地址的话会自动寻找项目web项目的根目录下的”/login.jsp”页面。

successUrl: 登录成功默认跳转页面,不配置则跳转至”/”。如果登陆前点击的一个需要登录的页面,则在登录自动跳转到那个需要登录的页面。不跳转到此。

unauthorizedUrl: 没有权限默认跳转的页面。

Shiro中默认的过滤器:

在spring中直接引入<import resource="spring-shiro.xml"></import>

第五步:在spring-mvc.xml中配置权限的控制 异常的跳转

 <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <!--表示捕获的异常 --> <prop key="org.apache.shiro.authz.UnauthorizedException"> <!--捕获该异常时跳转的路径 --> /403 </prop> <!--表示捕获的异常 --> <prop key="org.apache.shiro.authz.UnauthenticatedException"> <!--捕获该异常时跳转的路径 --> /403 </prop> </props> </property> </bean>
写在文末

最后给小伙伴们举几个配置实例

/admin=authc,roles[admin] 表示用户必需已通过认证,并拥有admin角色才可以正常发起’/admin’请求

/edit=authc,perms[admin:edit] 表示用户必需已通过认证,并拥有admin:edit权限才可以正常发起’/edit’请求

/home=user 表示用户不一定需要已经通过认证,只需要曾经被Shiro记住过登录状态就可以正常发起’/home’请求

欢迎大家多多关注,评论留言区多多互动,交流学习心得。

标签: #shiro认证每次请求都要 #shiro登录认证流程 #shiro框架的认证和授权流程 #apache shiro jar包