前言
在去年一年之间用过shiro的一些内容,但是最近又有点忘却了。现在正好有一个机会,所以正好搭建起来了然后自己做些记录
搭建过程
引入jar包:
需要使用shiro的话先在maven中引入以下Jar包:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| <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> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-web</artifactId> <version>1.4.0</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-ehcache</artifactId> <version>1.4.0</version> </dependency>
|
编写方法体:
在此之前需要加入以上jar包;当引入之后便可以进行spring和shiro的构建了。
在进行搭建之前需要建立两一个Realm
,一个shiro的核心控制器。需要继承AuthorizingRealm
然后实现两个方法:
在doGetAuthenticationInfo(AuthenticationToken authenticationToken)
方法中:
authenticationToken参数是从前端页面接受的一个参数,里面封装的是一个token,该token是从前端获取的,具体的获取方法是
1 2
| Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken(username, password);
|
在这段代码中的Controller获取到前端的用户名和密码之后在new UsernamePasswordToken(username, password)
这里会生成一个token,然后这个token会被传到realm中,最后在realm中的doGetAuthenticationInfo
接收到,然后在这里便可以进行数据库查询,要么返回异常,要么则是返回一个SimpleAuthenticationInfo
。这个代码如下:
1 2 3 4 5 6 7 8 9 10 11
| String username = (String) authenticationToken.getPrincipal(); String password = new String((char[])authenticationToken.getCredentials()); Map<String ,String > map =new HashMap<String, String>(); map.put("username" ,username); map.put("password",password); User user =loginservice.loginCheck(map); if (user == null || user.getId() == null){ throw new UnknownAccountException(); }else{ return new SimpleAuthenticationInfo(username, password, "myRealm"); }
|
上面的代码只是简单的进行了数据库查询然后封装为一个token。然后返回即可,那么对用户的权限进行操作的就是如下这个代码:
doGetAuthorizationInfo
这个是进行权限分配的方法:具体的方法体如下:
1 2 3 4 5 6 7 8 9 10 11
| protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { String username = (String) principalCollection.getPrimaryPrincipal(); List<Resources> resources =loginservice.getRoleById(username); 通过mybatis配置sql List<String> roles =new ArrayList<String>(); for (Resources r: resources){ roles.add(r.getRole()); } SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); info.addRoles(roles); return info; }
|
这里应该是还可以放一个权限,后面几篇日志在加上
ApplicationContext.xml的配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor"/>
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="myRealm"/> </bean>
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager"/> <property name="loginUrl" value="/"/> <property name="successUrl" value="/login/main.jsp"/> <property name="unauthorizedUrl" value="/login/TestPage"/> <property name="filters"> <map> <entry key="authc"> <bean class="org.apache.shiro.web.filter.authc.PassThruAuthenticationFilter" /> </entry> </map> </property> <property name="filterChainDefinitions"> <value> /user/** = authc /user/insert = authc,roles[ADMIN] /user/getUser = authc,roles[MANAGER] /user/toinsert = authc,roles[ADMIN] /role/admin = authc,roles[ADMIN] /role/manager = authc,roles[SUPERMANAG] /role/manager = authc,roles[MANAGER] </value> </property> </bean>
|