博客 / 詳情

返回

SpringBoot+Shiro

1、繼承AuthorizingRealm 實現 認證(doGetAuthenticationInfo) 和 授權(doGetAuthorizationInfo) 
2、shiro    配置UserRealm、DefaultWebSecurityManager、ShiroFilterFactoryBean
3、ShiroFilterFactoryBean方法裏配置認證和授權

登錄
 UsernamePasswordToken token = new UsernamePasswordToken(user.getUser(), user.getPassword());
 Subject subject = SecurityUtils.getSubject();
 subject.login(token);

退出登錄
        Subject subject = SecurityUtils.getSubject();
        subject.logout();

1、添加Shiro依賴

        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>1.4.1</version>
        </dependency>

2、創建ShiroConfig

@Configuration
public class ShiroConfig {

    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("manager")DefaultWebSecurityManager defaultWebSecurityManager){
        ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
        bean.setSecurityManager(defaultWebSecurityManager);

        LinkedHashMap<String, String> map = new LinkedHashMap<>();

        //添加shiro的內置過濾器
        /*
            anon:無需認證可以訪問
            authc:必須認證才能訪問
            user:必須擁有 記住我 功能才能用
            perms:擁有對某個資源的權限才能訪問
            role:擁有某個角色權限才能訪問
         */


        //perms需要在authc前面 先認證再授權

        //1、權限授權
        map.put("/user/selectAll","perms[user:user]");
        map.put("/user/selectOne","perms[user:add]");

        //2、認證
        map.put("/user/*","authc");

        bean.setFilterChainDefinitionMap(map);

        //沒有認證跳轉接口
        bean.setLoginUrl("/user");

        //沒有授權跳轉接口
        bean.setUnauthorizedUrl("/selectPerms");

        return bean;
    }

    @Bean("manager")
    public DefaultWebSecurityManager defaultWebSecurityManager(@Qualifier("userRealm")UserRealm userRealm){
        DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
        manager.setRealm(userRealm);
        return manager;
    }

    @Bean("userRealm")
    public UserRealm userRealm(){
        return new UserRealm();
    }
}

3、Realm授權、認證


public class UserRealm extends AuthorizingRealm {

    @Autowired
    private UserService userService;

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        System.out.println("授權++++++++++++++++++++++++++++++");
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();

        //獲取認證 得到的用户信息
        Subject subject = SecurityUtils.getSubject();
        User currentUser = (User) subject.getPrincipal();

        //設置當前用户的權限
        info.addStringPermission(currentUser.getPerms());

        return info;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        System.out.println("認證++++++++++++++++++++++++++++++");

        //接口new UsernamePasswordToken傳入的參數 authenticationToken
        UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;

        User user = userService.selectUser(token.getUsername());

        //用户不存在  報錯
        if (user == null){
            return null;
        }

        //user賦值過去 SecurityUtils.getSubject().getPrincipal();獲取user的值   user.getPassword()交給框架去校驗
        return new SimpleAuthenticationInfo(user,user.getPassword(),"");
    }
}

4、LogController

@RestController
public class LoginController {

    //退出當前登錄用户
    @GetMapping("/loginOut")
    public String loginOut(){
        Subject subject = SecurityUtils.getSubject();
        subject.logout();
        return "退出登錄";
    }

    @PostMapping("/login")
    public String login(@RequestBody User user){
        UsernamePasswordToken token = new UsernamePasswordToken(user.getUser(), user.getPassword());
        Subject subject = SecurityUtils.getSubject();
        try {
            subject.login(token);
            return "登錄成功";
        }catch (Exception e){
            return "登錄失敗";
        }
    }

    @GetMapping("/user")
    public String selectUser(){
        return "認證攔截";
    }

    @GetMapping("/selectPerms")
    public String selectPerms(){
        return "你沒有該權限";
    }

}

5、測試接口

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/selectAll")
    public List<User> selectAll(){
        return userService.selectAll();
    }

    @GetMapping("/selectOne")
    public List<User> selectOne(){
        return userService.selectAll();
    }

}
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.